public static AbstractType DemangleAndResolve(string mangledString, ResolutionContext ctxt, out ITypeDeclaration qualifier) { bool isCFunction; Demangler.Demangle(mangledString, out qualifier, out isCFunction); // Seek for C functions | Functions that have no direct module association (e.g. _Dmain) if(qualifier is IdentifierDeclaration && qualifier.InnerDeclaration == null) { var id = (qualifier as IdentifierDeclaration).Id; return Resolver.ASTScanner.NameScan.ScanForCFunction(ctxt, id, isCFunction); } bool seekCtor = false; if(qualifier is IdentifierDeclaration) { var id = (qualifier as IdentifierDeclaration).Id; if((seekCtor = (id == DMethod.ConstructorIdentifier)) || id == "__Class" || id =="__ModuleInfo") qualifier = qualifier.InnerDeclaration; } var resSym = TypeDeclarationResolver.ResolveSingle(qualifier,ctxt); if(seekCtor && resSym is UserDefinedType) { var ctor = (resSym as TemplateIntermediateType).Definition[DMethod.ConstructorIdentifier].FirstOrDefault(); if(ctor!= null) resSym = new MemberSymbol(ctor as DNode, null, null); } return resSym; }
void BuildCompletionData(MemberSymbol mrr, IBlockNode currentlyScopedBlock, bool isVariableInstance = false) { if (mrr.Base != null) BuildCompletionData(mrr.Base, currentlyScopedBlock, isVariableInstance || (mrr.Definition is DVariable && !(mrr is AliasedType) || // True if we obviously have a variable handled here. Otherwise depends on the samely-named parameter.. mrr.Definition is DMethod), mrr); else StaticProperties.ListProperties(CompletionDataGenerator, MemberFilter, mrr, false); }