Changeset 861

Show
Ignore:
Timestamp:
10/21/07 17:14:55 (1 year ago)
Author:
asterite
Message:

Optimized completion on goto statement (no need to do semantic, obviously).

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/descent.core/src/descent/internal/codeassist/CompletionEngine.java

    r860 r861  
    66import descent.core.CompletionProposal; 
    77import descent.core.CompletionRequestor; 
    8 import descent.core.IJavaElement; 
    98import descent.core.IJavaProject; 
    109import descent.core.IPackageFragmentRoot; 
     
    2322import descent.internal.compiler.parser.ASTDmdNode; 
    2423import descent.internal.compiler.parser.Argument; 
    25 import descent.internal.compiler.parser.DsymbolTable; 
     24import descent.internal.compiler.parser.ClassDeclaration; 
     25import descent.internal.compiler.parser.EnumDeclaration; 
     26import descent.internal.compiler.parser.FuncDeclaration; 
    2627import descent.internal.compiler.parser.Global; 
     28import descent.internal.compiler.parser.HashtableOfCharArrayAndObject; 
     29import descent.internal.compiler.parser.InterfaceDeclaration; 
     30import descent.internal.compiler.parser.LabelStatement; 
    2731import descent.internal.compiler.parser.Module; 
    2832import descent.internal.compiler.parser.SemanticContext; 
     33import descent.internal.compiler.parser.StructDeclaration; 
     34import descent.internal.compiler.parser.TemplateDeclaration; 
    2935import descent.internal.compiler.parser.Type; 
    3036import descent.internal.compiler.parser.TypeFunction; 
     37import descent.internal.compiler.parser.UnionDeclaration; 
     38import descent.internal.compiler.parser.ast.AstVisitorAdapter; 
    3139import descent.internal.compiler.util.HashtableOfObject; 
    3240import descent.internal.core.INamingRequestor; 
     
    249257     
    250258    private void completeGotoStatement(CompletionOnGotoStatement node) { 
    251         // TODO: a full semantic pass is not needed: optimize 
    252         doSemantic(this.module); 
    253          
    254         DsymbolTable table = node.fd.labtab; 
    255         if (table == null) { 
    256             return; 
    257         } 
    258          
    259         char[][] labels = table.keys(); 
     259        final HashtableOfCharArrayAndObject labelsMap = new HashtableOfCharArrayAndObject();         
     260        module.accept(new AstVisitorAdapter() { 
     261             
     262            private FuncDeclaration func; 
     263             
     264            @Override 
     265            public boolean visit(FuncDeclaration node) { 
     266                if (inRange(node)) { 
     267                    func = node; 
     268                    labelsMap.clear(); 
     269                    return true; 
     270                } else { 
     271                    return false; 
     272                } 
     273            } 
     274             
     275            @Override 
     276            public boolean visit(LabelStatement node) { 
     277                if (func != null && func.start <= node.start && node.start <= func.start + func.length) { 
     278                    labelsMap.put(node.ident.ident, this); 
     279                } 
     280                return true; 
     281            } 
     282             
     283            @Override 
     284            public boolean visit(EnumDeclaration node) { 
     285                return false; 
     286            } 
     287             
     288            @Override 
     289            public boolean visit(ClassDeclaration node) { 
     290                return inRange(node); 
     291            } 
     292             
     293            @Override 
     294            public boolean visit(InterfaceDeclaration node) { 
     295                return inRange(node); 
     296            } 
     297             
     298            @Override 
     299            public boolean visit(StructDeclaration node) { 
     300                return inRange(node); 
     301            } 
     302             
     303            @Override 
     304            public boolean visit(UnionDeclaration node) { 
     305                return inRange(node); 
     306            } 
     307             
     308            @Override 
     309            public boolean visit(TemplateDeclaration node) { 
     310                return inRange(node); 
     311            } 
     312             
     313            private boolean inRange(ASTDmdNode node) { 
     314                return node.start <= CompletionEngine.this.actualCompletionPosition && 
     315                    CompletionEngine.this.actualCompletionPosition <= node.start + node.length; 
     316            } 
     317             
     318        }); 
     319         
     320        char[][] labels = labelsMap.keys(); 
    260321        if (labels != null) { 
    261322            char[] prefix; 
  • trunk/descent.core/src/descent/internal/compiler/parser/HashtableOfCharArrayAndObject.java

    r860 r861  
    2525 
    2626    public HashtableOfCharArrayAndObject(int size) { 
     27        init(size); 
     28    } 
     29     
     30    public void clear() { 
     31        init(13); 
     32    } 
     33     
     34    private void init(int size) { 
    2735        this.elementSize = 0; 
    2836        this.threshold = size; // size represents the expected number of elements