Changeset 860

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

Completion on goto statement done... thought it could be optimized.

Files:

Legend:

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

    r858 r860  
    66import descent.core.CompletionProposal; 
    77import descent.core.CompletionRequestor; 
     8import descent.core.IJavaElement; 
    89import descent.core.IJavaProject; 
     10import descent.core.IPackageFragmentRoot; 
     11import descent.core.JavaModelException; 
    912import descent.core.compiler.CharOperation; 
    1013import descent.core.dom.AST; 
    1114import descent.internal.codeassist.complete.CompletionOnArgumentName; 
     15import descent.internal.codeassist.complete.CompletionOnGotoStatement; 
    1216import descent.internal.codeassist.complete.CompletionOnImport; 
    1317import descent.internal.codeassist.complete.CompletionOnModuleDeclaration; 
     
    1923import descent.internal.compiler.parser.ASTDmdNode; 
    2024import descent.internal.compiler.parser.Argument; 
     25import descent.internal.compiler.parser.DsymbolTable; 
     26import descent.internal.compiler.parser.Global; 
     27import descent.internal.compiler.parser.Module; 
     28import descent.internal.compiler.parser.SemanticContext; 
    2129import descent.internal.compiler.parser.Type; 
    2230import descent.internal.compiler.parser.TypeFunction; 
     
    4048    CompletionParser parser; 
    4149    CompletionRequestor requestor; 
     50     
     51    Module module; 
    4252     
    4353    char[] fileName = null; 
     
    124134             
    125135            CompletionParser parser = new CompletionParser(AST.D2, source); 
     136            parser.filename = this.fileName; 
    126137            parser.cursorLocation = completionPosition; 
    127138             
    128             parser.parseModuleObj(); 
     139            this.module = parser.parseModuleObj(); 
    129140            ASTDmdNode assistNode = parser.getAssistNode(); 
    130141             
     
    142153                    CompletionOnArgumentName node = (CompletionOnArgumentName) assistNode; 
    143154                    completeArgumentName(node); 
     155                } else if (assistNode instanceof CompletionOnGotoStatement) { 
     156                    CompletionOnGotoStatement node = (CompletionOnGotoStatement) assistNode; 
     157                    completeGotoStatement(node); 
    144158                } 
    145159            } 
     
    159173        } 
    160174    } 
    161      
     175 
     176    private void doSemantic(Module module) { 
     177        Global global = new Global(); 
     178         
     179        IPackageFragmentRoot[] roots; 
     180        try { 
     181            roots = this.javaProject.getAllPackageFragmentRoots(); 
     182            for(IPackageFragmentRoot root : roots) { 
     183                if (root.getResource() == null) { 
     184                    global.path.add(root.getPath().toOSString()); 
     185                } else { 
     186                    global.path.add(root.getResource().getLocation().toOSString()); 
     187                } 
     188            } 
     189        } catch (JavaModelException e) { 
     190        } 
     191         
     192        SemanticContext context = new SemanticContext(null, module, global); 
     193        module.semantic(context); 
     194    } 
     195 
    162196    private void completeModuleDeclaration(CompletionOnModuleDeclaration node) { 
    163197        char[] fqn = node.getFQN(); 
     
    212246         
    213247        findVariableNames(name, node.type, findExcludedNames(node)); 
     248    } 
     249     
     250    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(); 
     260        if (labels != null) { 
     261            char[] prefix; 
     262            if (node.ident == null || node.ident.ident == null) { 
     263                this.startPosition = this.actualCompletionPosition; 
     264                this.endPosition = this.actualCompletionPosition; 
     265                prefix = CharOperation.NO_CHAR; 
     266            } else { 
     267                this.startPosition = node.ident.start; 
     268                this.endPosition = node.ident.start + node.ident.length; 
     269                prefix = node.ident.ident; 
     270            } 
     271             
     272            for(char[] label : labels) { 
     273                if (label != null) { 
     274                    if (CharOperation.prefixEquals(prefix, label, false) && !CharOperation.equals(prefix, label)) { 
     275                        CompletionProposal proposal = this.createProposal(CompletionProposal.LABEL_REF, this.actualCompletionPosition); 
     276                        proposal.setName(label); 
     277                        proposal.setCompletion(label); 
     278                        proposal.setReplaceRange(this.startPosition - this.offset, this.endPosition - this.offset); 
     279                        CompletionEngine.this.requestor.accept(proposal); 
     280                    } 
     281                } 
     282            } 
     283        } 
    214284    } 
    215285     
  • trunk/descent.core/src/descent/internal/codeassist/complete/CompletionParser.java

    r858 r860  
    99import descent.internal.compiler.parser.Chars; 
    1010import descent.internal.compiler.parser.Expression; 
     11import descent.internal.compiler.parser.GotoStatement; 
    1112import descent.internal.compiler.parser.IdentifierExp; 
    1213import descent.internal.compiler.parser.Identifiers; 
     
    8182     
    8283    @Override 
     84    protected GotoStatement newGotoStatement(Loc loc, IdentifierExp ident) { 
     85        if (prevToken.ptr + prevToken.sourceLen <= cursorLocation && cursorLocation <= token.ptr 
     86                && prevToken.value != TOK.TOKdot && prevToken.value != TOK.TOKslice && prevToken.value != TOK.TOKdotdotdot) { 
     87         
     88            includeExpectations = false; 
     89             
     90            assistNode = new CompletionOnGotoStatement(loc, ident); 
     91            return (GotoStatement) assistNode; 
     92        } else {             
     93            return super.newGotoStatement(loc, ident); 
     94        } 
     95    } 
     96     
     97    @Override 
    8398    protected void expect(char[][] toks) { 
    8499        // If we are completing already a more important thing, exclude 
  • trunk/descent.core/src/descent/internal/compiler/parser/DsymbolTable.java

    r836 r860  
    11package descent.internal.compiler.parser; 
     2 
    23 
    34// DMD 1.020 
     
    2627    } 
    2728     
     29    /** 
     30     * Note: null entries may be present in the returned array. 
     31     */ 
     32    public char[][] keys() { 
     33        return map.keys(); 
     34    } 
     35     
    2836    @Override 
    2937    public String toString() { 
  • trunk/descent.core/src/descent/internal/compiler/parser/GotoStatement.java

    r840 r860  
    1111    public LabelDsymbol label; 
    1212    public TryFinallyStatement tf; 
     13     
     14    public FuncDeclaration fd; // descent: The parent function declaration after the first semantic pass is done 
    1315 
    1416    public GotoStatement(Loc loc, IdentifierExp ident) { 
     
    5759    public Statement semantic(Scope sc, SemanticContext context) { 
    5860        FuncDeclaration fd = sc.parent.isFuncDeclaration(); 
    59  
     61        this.fd = fd; // descent 
    6062        tf = sc.tf; 
     63         
     64        if (ident == null) { 
     65            // It's a broken node, it has already syntax errors, 
     66            // but assign fd and tf first 
     67            return this; 
     68        } 
     69         
    6170        label = fd.searchLabel(ident); 
    6271        if (null == label.statement && sc.fes != null) { 
  • trunk/descent.core/src/descent/internal/compiler/parser/HashtableOfCharArrayAndObject.java

    r768 r860  
    126126        return elementSize; 
    127127    } 
     128     
     129    public char[][] keys() { 
     130        return keyTable; 
     131    } 
    128132 
    129133    @Override 
  • trunk/descent.core/src/descent/internal/compiler/parser/Parser.java

    r858 r860  
    42374237                } 
    42384238                 
    4239                 s = new GotoStatement(loc, ident); 
     4239                s = newGotoStatement(loc, ident); 
    42404240            } 
    42414241            check(TOKsemicolon); 
     
    69626962    } 
    69636963     
     6964    protected GotoStatement newGotoStatement(Loc loc, IdentifierExp ident) { 
     6965        return new GotoStatement(loc, ident); 
     6966    } 
     6967     
    69646968    /** 
    69656969     * The parser expects the current token to be 
  • trunk/descent.core/src/descent/internal/compiler/parser/SemanticContext.java

    r857 r860  
    113113    public void acceptProblem(IProblem problem) { 
    114114//      System.out.println(problem); 
    115         if (global.gag == 0 && muteProblems == 0) { 
     115        if (global.gag == 0 && muteProblems == 0 && problemRequestor != null) { 
    116116            problemRequestor.acceptProblem(problem); 
    117117        }