public static TypeReferencesResult Scan(DModule ast, ResolutionContext ctxt) { if (ast == null) return new TypeReferencesResult(); var typeRefFinder = new TypeReferenceFinder(ctxt); ContextFrame backupFrame = null; if(ctxt.ScopedBlock == ast) backupFrame = ctxt.Pop (); if (ctxt.CurrentContext == null) { ctxt.Push(backupFrame); backupFrame = null; } //typeRefFinder.ast = ast; // Enum all identifiers ast.Accept (typeRefFinder); if (backupFrame != null) ctxt.Push (backupFrame); // Crawl through all remaining expressions by evaluating their types and check if they're actual type references. /*typeRefFinder.queueCount = typeRefFinder.q.Count; typeRefFinder.ResolveAllIdentifiers(); */ return typeRefFinder.result; }
/// <summary> /// </summary> /// <param name="ast">The syntax tree to scan</param> /// <param name="symbol">Might not be a child symbol of ast</param> /// <param name="ctxt">The context required to search for symbols</param> /// <returns></returns> public static IEnumerable <ISyntaxRegion> Scan(DModule ast, INode symbol, ResolutionContext ctxt, bool includeDefinition = true) { if (ast == null || symbol == null || ctxt == null) { return(null); } var f = new ReferencesFinder(symbol, ast, ctxt); using (ctxt.Push(ast)) ast.Accept(f); var nodeRoot = symbol.NodeRoot as DModule; if (includeDefinition && nodeRoot != null && nodeRoot.FileName == ast.FileName) { var dc = symbol.Parent as DClassLike; if (dc != null && dc.ClassType == D_Parser.Parser.DTokens.Template && dc.NameHash == symbol.NameHash) { f.l.Insert(0, new IdentifierDeclaration(dc.NameHash) { Location = dc.NameLocation, EndLocation = new CodeLocation(dc.NameLocation.Column + dc.Name.Length, dc.NameLocation.Line) }); } var loc = symbol.NameLocation; bool add = !f.l.AsParallel().Any( (o) => (o is TemplateParameter && (o as TemplateParameter).NameLocation == loc) || (o is INode && (o as INode).NameLocation == loc)); if (add) { f.l.Insert(0, new IdentifierDeclaration(symbol.NameHash) { Location = loc, EndLocation = new CodeLocation(loc.Column + symbol.Name.Length, loc.Line) }); } } return(f.l); }
public static Dictionary <int, Dictionary <ISyntaxRegion, byte> > Scan(DModule ast, ResolutionContext ctxt) { if (ast == null) { return(new Dictionary <int, Dictionary <ISyntaxRegion, byte> >()); } var typeRefFinder = new TypeReferenceFinder(ctxt); ContextFrame backupFrame = null; if (ctxt.ScopedBlock == ast) { backupFrame = ctxt.Pop(); } /* * if (ctxt.CurrentContext == null) * { * ctxt.Push(backupFrame); * backupFrame = null; * }*/ //typeRefFinder.ast = ast; // Enum all identifiers ast.Accept(typeRefFinder); if (backupFrame != null) { ctxt.Push(backupFrame); } // Crawl through all remaining expressions by evaluating their types and check if they're actual type references. /*typeRefFinder.queueCount = typeRefFinder.q.Count; * typeRefFinder.ResolveAllIdentifiers(); */ return(typeRefFinder.Matches); }
/// <summary> /// </summary> /// <param name="ast">Сканируемое синтаксическое дерево</param> /// <param name="symbol">Не может быть символом-пасынком АСТ</param> /// <param name="ctxt">Контекст, необходимый для поиска символов</param> /// <returns></returns> public static IEnumerable <ISyntaxRegion> Scan(DModule ast, INode symbol, ResolutionContext ctxt, bool includeDefinition = true) { if (ast == null || symbol == null || ctxt == null) { return(null); } ctxt.PushNewScope(ast); var f = new ReferencesFinder(symbol, ast, ctxt); ast.Accept(f); ctxt.Pop(); var nodeRoot = symbol.NodeRoot as DModule; if (includeDefinition && nodeRoot != null && nodeRoot.FileName == ast.FileName) { var dc = symbol.Parent as DClassLike; if (dc != null && dc.ClassType == DSharp.Parser.DTokens.Template && dc.NameHash == symbol.NameHash) { f.l.Insert(0, new IdentifierDeclaration(dc.NameHash) { Location = dc.NameLocation, EndLocation = new CodeLocation(dc.NameLocation.Column + dc.Name.Length, dc.NameLocation.Line) }); } f.l.Insert(0, new IdentifierDeclaration(symbol.NameHash) { Location = symbol.NameLocation, EndLocation = new CodeLocation(symbol.NameLocation.Column + symbol.Name.Length, symbol.NameLocation.Line) }); } return(f.l); }
/// <summary> /// </summary> /// <param name="ast">The syntax tree to scan</param> /// <param name="symbol">Might not be a child symbol of ast</param> /// <param name="ctxt">The context required to search for symbols</param> /// <returns></returns> public static IEnumerable<ISyntaxRegion> Scan(DModule ast, INode symbol, ResolutionContext ctxt, bool includeDefinition = true) { if (ast == null || symbol == null || ctxt == null) return null; ctxt.PushNewScope(ast); var f = new ReferencesFinder(symbol, ast, ctxt); ast.Accept (f); ctxt.Pop(); var nodeRoot = symbol.NodeRoot as DModule; if (includeDefinition && nodeRoot != null && nodeRoot.FileName == ast.FileName) { var dc = symbol.Parent as DClassLike; if (dc != null && dc.ClassType == DSharp.Parser.DTokens.Template && dc.NameHash == symbol.NameHash) { f.l.Insert(0, new IdentifierDeclaration(dc.NameHash) { Location = dc.NameLocation, EndLocation = new CodeLocation(dc.NameLocation.Column + dc.Name.Length, dc.NameLocation.Line) }); } f.l.Insert(0, new IdentifierDeclaration(symbol.NameHash) { Location = symbol.NameLocation, EndLocation = new CodeLocation(symbol.NameLocation.Column + symbol.Name.Length, symbol.NameLocation.Line) }); } return f.l; }
/// <summary> /// Use this method for letting this visitor visit the syntax tree. /// </summary> public void WalkThroughAst() { ast.Accept(this); }