public static IDeclaredElement GetPrimaryDeclaredElementForMethod(IMethod declaredElement) { string methodName = declaredElement.ShortName; if ("parse".Equals(methodName.Substring(0, "parse".Length))) { string ruleName = methodName.Substring("parse".Length, methodName.Length - "parse".Length); var cache = declaredElement.GetPsiServices().Solution.GetComponent <PsiCache>(); List <IPsiSymbol> symbols = cache.GetSymbols(PsiRenamesFactory.NameFromCamelCase(ruleName)).ToList(); if (symbols.Count > 0) { IPsiSymbol symbol = symbols.ToArray()[0]; ITreeNode element = symbol.SourceFile.GetPsiFile <PsiLanguage>(new DocumentRange(symbol.SourceFile.Document, 0)).FindNodeAt(new TreeTextRange(new TreeOffset(symbol.Offset), 1)); List <PsiOptionSymbol> parserPackageName = cache.GetOptionSymbols("parserPackage").ToList(); List <PsiOptionSymbol> parserClassName = cache.GetOptionSymbols("parserClassName").ToList(); IList <IDeclaredElement> classes = new List <IDeclaredElement>(); foreach (PsiOptionSymbol packageName in parserPackageName) { foreach (PsiOptionSymbol className in parserClassName) { if (packageName.SourceFile == className.SourceFile) { IPsiSourceFile sourceFile = packageName.SourceFile; CollectionUtil.AddRange( classes, sourceFile.PsiModule.GetPsiServices().CacheManager.GetDeclarationsCache(sourceFile.PsiModule, false, true). GetTypeElementsByCLRName(packageName.Value + "." + className.Value)); } } } var parentClass = declaredElement.GetContainingType() as IClass; if (parentClass != null) { if (classes.Contains(parentClass)) { while (element != null) { if (element is IDeclaredElement) { { return((IDeclaredElement)element); } } element = element.Parent; } } } { return(null); } } } else { return(GetPrimaryDeclaredElementForVisitorMethod(declaredElement, declaredElement)); } return(null); }