@Nullable public static PsiElement resolveMixin(@NotNull PsiElement base, @NotNull String name) { CssResolveProcessor processor = CssPluginsFacade.getMixinProcessor(base, name); if (processor.executeInScope(base)) { processFile( base.getContainingFile(), processor, ResolveState.initial().put(PROCESSED_PATHS, new HashSet<String>())); } return processor.getResult(); }
private static boolean processFile( final PsiFile file, final CssResolveProcessor processor, final ResolveState state) { if (!pushPath(file, state)) { // Already visited, skip return true; } // Process declarations in file if (!PsiTreeUtil.processElements(file, processor)) { return false; } // Process imports in file CssImport cssImport; while ((cssImport = processor.popImport()) != null) { PsiElement resolvedImport = cssImport.resolve(); if (resolvedImport instanceof PsiFile) { if (!processFile((PsiFile) resolvedImport, processor, state)) { return false; } } } // Recurse on files importing this file CssUtils.getPsiSearchHelper(file.getProject()) .processElementsWithWord( new TextOccurenceProcessor() { public boolean execute(PsiElement element, int offsetInElement) { if (element.getParent().getParent() instanceof CssImport) { CssImport cssImport = (CssImport) element.getParent().getParent(); String uri = cssImport.getUriString(); if (uri.endsWith(file.getName())) { PsiElement importedFile = cssImport.resolve(); if (file == importedFile) { if (!processFile(cssImport.getContainingFile(), processor, state)) { return false; } } } } return true; } }, getResolveSearchScope(file), file.getName(), (short) (UsageSearchContext.IN_CODE | UsageSearchContext.IN_STRINGS), true); return true; }