Changeset 1173

Show
Ignore:
Timestamp:
05/24/08 19:51:37 (5 months ago)
Author:
asterite
Message:

Started implemeting the "Override method 'foo' in 'Class'" autocompletion. Finished porting the parser to DMD 2.013.

Files:

Legend:

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

    r1161 r1173  
    11package descent.internal.codeassist; 
    22 
     3import java.util.ArrayList; 
    34import java.util.HashMap; 
    45import java.util.List; 
     
    13421343            rootScope = scope; 
    13431344             
     1345            boolean wantOverrides = node instanceof CompletionOnClassDeclaration && ((CompletionOnClassDeclaration) node).isCompletingScope; 
     1346             
    13441347            if (baseClassIndex == -1) { 
    13451348                currentName = CharOperation.NO_CHAR; 
     
    13481351                 
    13491352                completeScope(rootScope, INCLUDE_ALL); 
     1353                 
     1354                if (wantOverrides) { 
     1355                    List<FuncDeclaration> funcs = new ArrayList<FuncDeclaration>(); 
     1356                     
     1357                    // Suggest override of the function if its virtual 
     1358                    // and it's not from this class 
     1359                    for(Object obj : node.vtbl) { 
     1360                        if (obj instanceof FuncDeclaration) { 
     1361                            FuncDeclaration fd = (FuncDeclaration) obj; 
     1362                            if (fd.parent != node) { 
     1363                                suggestOverride(fd); 
     1364                            } 
     1365                             
     1366                            funcs.add(fd); 
     1367                        } 
     1368                    } 
     1369                     
     1370                    // Also suggest interfaces methods, but only if these 
     1371                    // are not already present in this class 
     1372                    for(BaseClass bc : node.vtblInterfaces) { 
     1373                        TypeClass tc = (TypeClass) bc.type; 
     1374                    loop: 
     1375                        for(Dsymbol member : tc.sym.members) { 
     1376                            if (member instanceof FuncDeclaration) { 
     1377                                FuncDeclaration fd = (FuncDeclaration) member; 
     1378                                for(FuncDeclaration old : funcs) { 
     1379                                    if (ASTDmdNode.equals(fd.ident, old.ident)) { 
     1380                                        int cov = fd.type.covariant(old.type, semanticContext); 
     1381                                        if(cov == 1) { 
     1382                                            continue loop; 
     1383                                        } 
     1384                                    } 
     1385                                } 
     1386                                     
     1387                                suggestOverride(fd); 
     1388                            } 
     1389                        } 
     1390                    } 
     1391                } 
    13501392            } else { 
    13511393                completeNode(node.baseclasses.get(baseClassIndex).type); 
     
    13531395        } 
    13541396    } 
    1355      
     1397 
    13561398    private void completeSuperDotExp(CompletionOnSuperDotExp node) throws JavaModelException { 
    13571399        doSemantic(); 
     
    18481890            suggestIntegralProperties(enumDeclaration.getSignature().toCharArray()); 
    18491891        } 
     1892    } 
     1893     
     1894    private void suggestOverride(FuncDeclaration fd) { 
     1895        CompletionProposal proposal = createProposal(CompletionProposal.METHOD_DECLARATION, this.actualCompletionPosition, fd); 
     1896         
     1897        int relevance = computeBaseRelevance(); 
     1898        relevance += computeRelevanceForInterestingProposal(); 
     1899        relevance += computeRelevanceForCaseMatching(currentName, fd.ident.ident); 
     1900        relevance += R_METHOD_OVERIDE; 
     1901         
     1902        proposal.setName(fd.ident.ident); 
     1903         
     1904        handleMethodCompletion(proposal, fd.ident.ident); 
     1905         
     1906        proposal.setSignature(fd.getSignature().toCharArray()); 
     1907        proposal.setTypeSignature(fd.type.getSignature().toCharArray()); 
     1908        proposal.setDeclarationSignature(fd.parent.getSignature().toCharArray()); 
     1909        proposal.setRelevance(relevance); 
     1910        proposal.setReplaceRange(this.startPosition - this.offset, this.endPosition - this.offset); 
     1911        CompletionEngine.this.requestor.accept(proposal); 
    18501912    } 
    18511913     
  • trunk/descent.core/src/descent/internal/codeassist/RelevanceConstants.java

    r1131 r1173  
    3535    int R_NAME_SUFFIX = 3; 
    3636    int R_NAME_LESS_NEW_CHARACTERS = 15; 
    37     int R_METHOD_OVERIDE = 3
     37    int R_METHOD_OVERIDE = 30
    3838    int R_NON_RESTRICTED = 3; 
    3939    int R_TRUE_OR_FALSE = 40; 
  • trunk/descent.core/src/descent/internal/codeassist/complete/CompletionOnClassDeclaration.java

    r1136 r1173  
    1212    public Scope theScope; 
    1313    public int baseClassIndex = -1; 
     14    public boolean isCompletingScope = false; 
    1415 
    1516    public CompletionOnClassDeclaration(Loc loc, IdentifierExp id, 
  • trunk/descent.core/src/descent/internal/codeassist/complete/CompletionParser.java

    r1147 r1173  
    1414import descent.internal.compiler.parser.CaseStatement; 
    1515import descent.internal.compiler.parser.Chars; 
     16import descent.internal.compiler.parser.ClassDeclaration; 
    1617import descent.internal.compiler.parser.CompoundStatement; 
    1718import descent.internal.compiler.parser.ContinueStatement; 
     
    101102    @Override 
    102103    protected boolean dietParse(FuncDeclaration f) { 
    103          
    104104        // If any argument is being autocompleted, don't skip 
    105105        // Same for return type 
     
    854854     
    855855    @Override 
     856    protected AggregateDeclaration endAggregateDeclaration(AggregateDeclaration a) { 
     857        if (a instanceof ClassDeclaration && a.start < cursorLocation && cursorLocation < a.start + a.length) { 
     858            ClassDeclaration original = (ClassDeclaration) a; 
     859            CompletionOnClassDeclaration cc = new CompletionOnClassDeclaration(original.loc, original.ident, original.baseclasses); 
     860            cc.members = original.members; 
     861            cc.sourceMembers = original.sourceMembers; 
     862            cc.isCompletingScope = true; 
     863             
     864            assistNode = cc; 
     865            return cc; 
     866        } 
     867        return super.endAggregateDeclaration(a); 
     868    } 
     869     
     870    @Override 
    856871    protected AggregateDeclaration newInterfaceDeclaration(Loc loc, IdentifierExp id, BaseClasses baseClasses) { 
    857872        // We don't want assist for an aggregate's name, but we do want it 
  • trunk/descent.core/src/descent/internal/compiler/SourceElementParser.java

    r1171 r1173  
    10981098     
    10991099    @Override 
     1100    public void endVisit(PostBlitDeclaration node) { 
     1101        nodeStack.pop(); 
     1102         
     1103        requestor.exitMethod(endOfDeclaration(node), -1, -1); 
     1104        popLevelInAttribDeclarationStack(); 
     1105    } 
     1106     
     1107    @Override 
    11001108    public void endVisit(CtorDeclaration node) { 
    11011109        nodeStack.pop(); 
  • trunk/descent.core/src/descent/internal/compiler/parser/ClassDeclaration.java

    r1160 r1173  
    707707            Dsymbol s = members.get(i); 
    708708            s.semantic(sc, context); 
     709             
     710            // Need this for vtbl 
     711            s.consumeRest(); 
    709712        } 
    710713 
  • trunk/descent.core/src/descent/internal/compiler/parser/FuncDeclaration.java

    r1171 r1173  
    10651065                // Verify this doesn't override previous final function 
    10661066                if (cd.baseClass != null) { 
    1067                     if (ident.toString().equals("callWindowProc")) { 
    1068                         System.out.println(1); 
    1069                     } 
    1070  
    10711067                    Dsymbol s = cd.baseClass.search(loc, ident, 0, context); 
    10721068                    if (s != null) { 
  • trunk/descent.core/src/descent/internal/compiler/parser/InterfaceDeclaration.java

    r1160 r1173  
    283283 
    284284        for (int j = 0; j < size(members); j++) { 
    285             members.get(j).semantic(sc, context); 
     285            Dsymbol s = members.get(j); 
     286            s.semantic(sc, context); 
     287             
     288            // Need this for vtbl 
     289            s.consumeRest(); 
    286290        } 
    287291        sc.pop(); 
  • trunk/descent.core/src/descent/internal/compiler/parser/IsExp.java

    r1160 r1173  
    1919    public IsExp(Loc loc, Type targ, IdentifierExp id, TOK tok, Type tspec, 
    2020            TOK tok2) { 
     21        this(loc, targ, id, tok, tspec, tok2, null); 
     22    } 
     23     
     24    public IsExp(Loc loc, Type targ, IdentifierExp id, TOK tok, Type tspec, 
     25            TOK tok2, TemplateParameters parameters) { 
    2126        super(loc, TOK.TOKis); 
    2227        this.targ = this.sourceTarg = targ; 
     
    2530        this.tspec = this.sourceTspec = tspec; 
    2631        this.tok2 = tok2; 
     32        this.parameters = parameters; 
    2733    } 
    2834 
  • trunk/descent.core/src/descent/internal/compiler/parser/Parser.java

    r1171 r1173  
    873873                    attachLeadingComments(s); 
    874874                } 
     875                 
     876                // Hook method for subclasses 
     877                if (s instanceof AggregateDeclaration) { 
     878                    s = endAggregateDeclaration((AggregateDeclaration) s); 
     879                } 
     880                 
    875881                decldefs.add(s); 
    876882            } 
     
    20092015            nextToken(); 
    20102016            Dsymbols decl = parseDeclDefs(false); 
     2017             
    20112018            if (token.value != TOKrcurly) { 
    20122019                parsingErrorInsertTokenAfter(prevToken, "}"); 
     
    62636270            TOK tok = TOKreserved; 
    62646271            TOK tok2 = TOKreserved; 
     6272            TemplateParameters tpl = null; 
     6273            Loc loc = this.loc; 
    62656274 
    62666275            nextToken(); 
     
    62886297                                    || token.value == TOKenum 
    62896298                                    || token.value == TOKinterface 
     6299                                    || (apiLevel == D2 && token.value == TOKconst && peek(token).value == TOKrparen) 
     6300                                    || (apiLevel == D2 && token.value == TOKinvariant && peek(token).value == TOKrparen) 
    62906301                                    || token.value == TOKfunction 
    62916302                                    || token.value == TOKdelegate || token.value == TOKreturn)) { 
     
    63016312                    } 
    63026313                } 
    6303                 check(TOKrparen); 
     6314                 
     6315                if (apiLevel == D2 && ident != null && tspec != null) { 
     6316                    if (token.value == TOKcomma) 
     6317                        tpl = parseTemplateParameterList(1, null); 
     6318                    else { 
     6319                        tpl = new TemplateParameters(); 
     6320                        check(TOKrparen); 
     6321                    } 
     6322                    TemplateParameter tp = new TemplateTypeParameter(loc, 
     6323                            ident, null, null); 
     6324                    tpl.add(0, tp); 
     6325                } else { 
     6326                    check(TOKrparen); 
     6327                } 
    63046328            } else { 
    63056329                parsingErrorInsertToComplete(prevToken, "(type identifier : specialization)", "IftypeDeclaration"); 
     
    63116335                break; 
    63126336            } 
    6313             e = new IsExp(loc(), targ, ident, tok, tspec, tok2); 
     6337            if (apiLevel == D2) { 
     6338                e = new IsExp(loc(), targ, ident, tok, tspec, tok2, tpl); 
     6339            } else { 
     6340                e = new IsExp(loc(), targ, ident, tok, tspec, tok2); 
     6341            } 
    63146342            break; 
    63156343        } 
     
    67236751                case TOKdelegate: 
    67246752                case TOKtypeof: 
     6753                case TOKfile: 
     6754                case TOKline: 
    67256755                    // CASE_BASIC_TYPES: // (type)int.size 
    67266756                case TOKwchar: 
     
    68096839        FuncLiteralDeclaration fd; 
    68106840        Type t; 
     6841        boolean isnothrow = false; 
     6842        boolean ispure = false; 
    68116843 
    68126844        if (token.value == TOKlcurly) { 
     
    68256857            arguments = parseParameters(pointer2_varargs); 
    68266858            varargs = pointer2_varargs[0]; 
     6859             
     6860            if (apiLevel == D2) { 
     6861                while (true) { 
     6862                    if (token.value == TOKpure) 
     6863                        ispure = true; 
     6864                    else if (token.value == TOKnothrow) 
     6865                        isnothrow = true; 
     6866                    else 
     6867                        break; 
     6868                    nextToken(); 
     6869                } 
     6870            } 
    68276871        } 
    68286872         
    68296873        t = new TypeFunction(arguments, t, varargs, linkage); 
     6874        ((TypeFunction) t).ispure = ispure; 
     6875        ((TypeFunction) t).isnothrow = isnothrow; 
     6876         
    68306877        fd = new FuncLiteralDeclaration(loc(), t, save, null); 
    6831          
    68326878         
    68336879        parseContracts(fd); 
     
    78857931    } 
    78867932     
     7933    protected AggregateDeclaration endAggregateDeclaration(AggregateDeclaration a) { 
     7934        return a; 
     7935    } 
     7936     
    78877937    private Statement dietParseStatement(FuncDeclaration f) { 
    78887938        if (diet) { 
  • trunk/descent.core/src/descent/internal/compiler/parser/SemanticContext.java

    r1161 r1173  
    8585     
    8686    public final ASTNodeEncoder encoder; 
     87    public boolean alwaysResolveFunctionSemanticRest; 
    8788    private final List<ASTDmdNode> templateEvaluationStack; 
    8889     
  • trunk/descent.ui/src/descent/ui/text/java/CompletionProposalCollector.java

    r1104 r1173  
    4444import descent.internal.ui.text.java.GetterSetterCompletionProposal; 
    4545import descent.internal.ui.text.java.JavaCompletionProposal; 
    46 import descent.internal.ui.text.java.JavaMethodCompletionProposal; 
    4746import descent.internal.ui.text.java.JavaTemplateCompletionProposal; 
    4847import descent.internal.ui.text.java.JavaTemplatedFunctionCompletionProposal; 
     
    5251import descent.internal.ui.text.java.LazyJavaTypeCompletionProposal; 
    5352import descent.internal.ui.text.java.MethodCompletionProposal; 
     53import descent.internal.ui.text.java.MethodProposalInfo; 
     54import descent.internal.ui.text.java.OverrideCompletionProposal; 
    5455import descent.internal.ui.text.java.ProposalContextInformation; 
    5556import descent.internal.ui.viewsupport.ImageDescriptorRegistry; 
     
    758759            return null; 
    759760 
    760         return null; 
    761         /* TODO JDT UI override 
    762761        String name= String.valueOf(proposal.getName()); 
    763762        String[] paramTypes= Signature.getParameterTypes(String.valueOf(proposal.getSignature())); 
    764763        for (int index= 0; index < paramTypes.length; index++) 
    765             paramTypes[index]= Signature.toString(paramTypes[index]); 
     764            paramTypes[index]= Signature.toString(paramTypes[index], false /* don't fully qualiffy names */); 
    766765        int start= proposal.getReplaceStart(); 
    767766        int length= getLength(proposal); 
     
    776775        fSuggestedMethodNames.add(new String(name)); 
    777776        return javaProposal; 
    778         */ 
    779777    } 
    780778 
  • trunk/descent.unittest/src/descent/internal/unittest/launcher/UnittestLaunchConfiguration.java

    r1169 r1173  
    217217    private static CoreException error(String message) 
    218218    { 
    219         return new CoreException(new Status(IStatus.ERROR,  
    220                 DescentUnittestPlugin.PLUGIN_ID, message)); 
     219        return new CoreException(new Status(IStatus.ERROR, DescentUnittestPlugin.PLUGIN_ID, IStatus.ERROR, message, null)); 
    221220    } 
    222221