Changeset 858

Show
Ignore:
Timestamp:
10/21/07 15:36:45 (1 year ago)
Author:
asterite
Message:

Completion on function argument name done... kind of...

Files:

Legend:

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

    r856 r858  
    1818import descent.internal.compiler.env.ICompilationUnit; 
    1919import descent.internal.compiler.parser.ASTDmdNode; 
     20import descent.internal.compiler.parser.Argument; 
     21import descent.internal.compiler.parser.Type; 
     22import descent.internal.compiler.parser.TypeFunction; 
    2023import descent.internal.compiler.util.HashtableOfObject; 
     24import descent.internal.core.INamingRequestor; 
     25import descent.internal.core.InternalNamingConventions; 
    2126import descent.internal.core.SearchableEnvironment; 
    2227 
     
    195200     
    196201    private void completeArgumentName(CompletionOnArgumentName node) { 
    197          
     202        char[] name; 
     203        if (node.ident == null || node.ident.ident == null) { 
     204            this.startPosition = this.actualCompletionPosition; 
     205            this.endPosition = this.actualCompletionPosition; 
     206            name = CharOperation.NO_CHAR; 
     207        } else { 
     208            this.startPosition = node.ident.start; 
     209            this.endPosition = node.ident.start + node.ident.length; 
     210            name = node.ident.ident; 
     211        } 
     212         
     213        findVariableNames(name, node.type, findExcludedNames(node)); 
     214    } 
     215     
     216    private char[][] findExcludedNames(CompletionOnArgumentName node) { 
     217        TypeFunction parent = node.parentType; 
     218        if (parent == null || parent.parameters == null) { 
     219            return CharOperation.NO_CHAR_CHAR; 
     220        } 
     221         
     222        char[][] excluded = new char[parent.parameters.size() - 1][]; 
     223        for(int i = 0, j = 0; i < parent.parameters.size(); i++) { 
     224            Argument arg = parent.parameters.get(i); 
     225            if (arg == node) { 
     226                continue; 
     227            } 
     228             
     229            if (arg.ident == null || arg.ident.ident == null) { 
     230                excluded[j] = CharOperation.NO_CHAR; 
     231            } else { 
     232                excluded[j] = arg.ident.ident; 
     233            } 
     234            j++; 
     235        } 
     236        return excluded; 
     237    } 
     238 
     239    private void findVariableNames(char[] name, Type type, char[][] excludeNames){ 
     240        // compute variable name for non base type 
     241        final char[] t = name; 
     242        INamingRequestor namingRequestor = new INamingRequestor() { 
     243            public void acceptNameWithPrefixAndSuffix(char[] name, boolean isFirstPrefix, boolean isFirstSuffix, int reusedCharacters) { 
     244                accept( 
     245                        name, 
     246                        (isFirstPrefix ? R_NAME_FIRST_PREFIX : R_NAME_PREFIX) + (isFirstSuffix ? R_NAME_FIRST_SUFFIX : R_NAME_SUFFIX), 
     247                        reusedCharacters); 
     248            } 
     249 
     250            public void acceptNameWithPrefix(char[] name, boolean isFirstPrefix, int reusedCharacters) { 
     251                accept(name, isFirstPrefix ? R_NAME_FIRST_PREFIX :  R_NAME_PREFIX, reusedCharacters); 
     252            } 
     253 
     254            public void acceptNameWithSuffix(char[] name, boolean isFirstSuffix, int reusedCharacters) { 
     255                accept(name, isFirstSuffix ? R_NAME_FIRST_SUFFIX : R_NAME_SUFFIX, reusedCharacters); 
     256            } 
     257 
     258            public void acceptNameWithoutPrefixAndSuffix(char[] name,int reusedCharacters) { 
     259                accept(name, 0, reusedCharacters); 
     260            } 
     261            void accept(char[] name, int prefixAndSuffixRelevance, int reusedCharacters){ 
     262                if (CharOperation.prefixEquals(t, name, false)) { 
     263                    int relevance = computeBaseRelevance(); 
     264                    relevance += computeRelevanceForInterestingProposal(); 
     265                    relevance += computeRelevanceForCaseMatching(t, name); 
     266                    relevance += prefixAndSuffixRelevance; 
     267                    if(reusedCharacters > 0) relevance += R_NAME_LESS_NEW_CHARACTERS; 
     268                    //relevance += computeRelevanceForRestrictions(IAccessRule.K_ACCESSIBLE); // no access restriction for variable name 
     269                     
     270                    // accept result 
     271                    //CompletionEngine.this.noProposal = false; 
     272                    if(!CompletionEngine.this.requestor.isIgnored(CompletionProposal.VARIABLE_DECLARATION)) { 
     273                        CompletionProposal proposal = CompletionEngine.this.createProposal(CompletionProposal.VARIABLE_DECLARATION, CompletionEngine.this.actualCompletionPosition); 
     274                        //proposal.setSignature(getSignature(typeBinding)); 
     275                        //proposal.setPackageName(q); 
     276                        //proposal.setTypeName(displayName); 
     277                        proposal.setName(name); 
     278                        proposal.setCompletion(name); 
     279                        //proposal.setFlags(Flags.AccDefault); 
     280                        proposal.setReplaceRange(CompletionEngine.this.startPosition - CompletionEngine.this.offset, CompletionEngine.this.endPosition - CompletionEngine.this.offset); 
     281                        proposal.setRelevance(relevance); 
     282                        CompletionEngine.this.requestor.accept(proposal); 
     283                    } 
     284                } 
     285            } 
     286        }; 
     287         
     288        InternalNamingConventions.suggestArgumentNames( 
     289                this.javaProject,  
     290                CharOperation.NO_CHAR,  
     291                InternalNamingConventions.readableName(type),  
     292                0,  
     293                name,  
     294                excludeNames,  
     295                namingRequestor); 
    198296    } 
    199297     
  • trunk/descent.core/src/descent/internal/codeassist/complete/CompletionParser.java

    r856 r858  
    2323    private ASTDmdNode assistNode; 
    2424    private List<ICompletionOnKeyword> keywordCompletions; 
     25    private boolean includeExpectations = true; 
    2526 
    2627    public CompletionParser(int apiLevel, char[] source) { 
     
    4243         
    4344        if (start <= cursorLocation && cursorLocation <= end) { 
     45            includeExpectations = false; 
     46             
    4447            assistNode = new CompletionOnModuleDeclaration(packages, module, cursorLocation); 
    4548            return (ModuleDeclaration) assistNode; 
     
    5558     
    5659        if (start <= cursorLocation && cursorLocation <= end) { 
     60            includeExpectations = false; 
     61             
    5762            assistNode = new CompletionOnImport(loc, packages, module, aliasid, isstatic, cursorLocation); 
    5863            return (Import) assistNode; 
     
    6469    @Override 
    6570    protected Argument newArgument(int storageClass, Type at, IdentifierExp ai, Expression ae) { 
    66         if (prevToken.ptr + prevToken.sourceLen <= cursorLocation && cursorLocation <= token.ptr) { 
     71        if (prevToken.ptr + prevToken.sourceLen <= cursorLocation && cursorLocation <= token.ptr 
     72                && prevToken.value != TOK.TOKdot && prevToken.value != TOK.TOKslice && prevToken.value != TOK.TOKdotdotdot) { 
     73            includeExpectations = false; 
     74             
    6775            assistNode = new CompletionOnArgumentName(storageClass, at, ai, ae); 
    6876            return (Argument) assistNode; 
     
    7482    @Override 
    7583    protected void expect(char[][] toks) { 
    76         if (prevToken.ptr + prevToken.sourceLen <= cursorLocation && cursorLocation <= token.ptr + token.sourceLen) { 
     84        // If we are completing already a more important thing, exclude 
     85        // the keyword completion 
     86        if (!includeExpectations) { 
     87            return; 
     88        } 
     89         
     90        if (prevToken.ptr + prevToken.sourceLen <= cursorLocation && cursorLocation <= token.ptr + token.sourceLen 
     91                && prevToken.value != TOK.TOKdot && prevToken.value != TOK.TOKslice && prevToken.value != TOK.TOKdotdotdot) { 
    7792            if (keywordCompletions == null) { 
    7893                keywordCompletions = new ArrayList<ICompletionOnKeyword>(); 
  • trunk/descent.core/src/descent/internal/compiler/parser/Argument.java

    r818 r858  
    177177    public IdentifierExp ident; 
    178178    public Expression defaultArg, sourceDefaultArg; 
     179    public TypeFunction parentType; // Added field to keep track of the argument's parent 
    179180 
    180181    public Argument(int storageClass, Type type, IdentifierExp ident, 
  • trunk/descent.core/src/descent/internal/compiler/parser/Parser.java

    r856 r858  
    26192619 
    26202620                t = new TypeFunction(arguments, t, varargs, linkage); 
     2621                 
     2622                // Assign parent of arguments 
     2623                if (arguments != null) { 
     2624                    for(int i = 0; i < arguments.size(); i++) { 
     2625                        arguments.get(i).parentType = (TypeFunction) t; 
     2626                    } 
     2627                } 
     2628                 
    26212629                if (save == TOKdelegate) { 
    26222630                    t = new TypeDelegate(t); 
     
    27512759 
    27522760            int[] pointer2_varargs = { varargs }; 
    2753             arguments = parseParameters(pointer2_varargs); 
     2761            arguments = parseParameters(pointer2_varargs);          
    27542762            varargs = pointer2_varargs[0]; 
    27552763             
    27562764            ta = new TypeFunction(arguments, t, varargs, linkage); 
     2765             
     2766            // Assign parent of arguments 
     2767            if (arguments != null) { 
     2768                for(int i = 0; i < arguments.size(); i++) { 
     2769                    arguments.get(i).parentType = (TypeFunction) ta; 
     2770                } 
     2771            } 
     2772             
    27572773            ta.setSourceRange(t.start, t.length); 
    27582774             
  • trunk/descent.core/src/descent/internal/core/InternalNamingConventions.java

    r210 r858  
    2222import descent.internal.codeassist.impl.AssistOptions; 
    2323import descent.internal.compiler.impl.CompilerOptions; 
     24import descent.internal.compiler.parser.ASTDmdNode; 
    2425import descent.internal.compiler.parser.ScannerHelper; 
     26import descent.internal.compiler.parser.Type; 
     27import descent.internal.compiler.parser.TypeAArray; 
     28import descent.internal.compiler.parser.TypeInstance; 
     29import descent.internal.compiler.parser.TypeSlice; 
    2530 
    2631public class InternalNamingConventions { 
     
    303308        boolean previousIsLetter = true; 
    304309        for(int i = sourceName.length - 1 ; i >= 0 ; i--){ 
    305             boolean isUpperCase = ScannerHelper.isUpperCase(sourceName[i])
     310            boolean isUpperCase = ScannerHelper.isUpperCase(sourceName[i]) || i == 0
    306311            boolean isLetter = ScannerHelper.isLetter(sourceName[i]); 
    307             if(isUpperCase && !previousIsUpperCase && previousIsLetter){ 
     312            if(isUpperCase && /* !previousIsUpperCase && */ previousIsLetter){ 
    308313                char[] name = CharOperation.subarray(sourceName,i,sourceName.length); 
    309314                if(name.length > 1){ 
     
    432437            return true; 
    433438    } 
     439     
     440    /** 
     441     * Returns a readable name for the given type. 
     442     */ 
     443    public static final char[] readableName(Type type) { 
     444        StringBuilder sb = new StringBuilder(); 
     445         
     446        appendReadableName(type, sb); 
     447         
     448        char[] ret = new char[sb.length()]; 
     449        sb.getChars(0, sb.length(), ret, 0); 
     450        return ret; 
     451    } 
     452     
     453    private static final void appendReadableName(Type type, StringBuilder sb) { 
     454        switch(type.getNodeType()) { 
     455        case ASTDmdNode.TYPE_A_ARRAY: 
     456            TypeAArray taa = (TypeAArray) type;          
     457            appendUppercaseReadableName(taa.index, sb);          
     458            sb.append("To"); 
     459            appendUppercaseReadableName(taa.next, sb); 
     460            break; 
     461        case ASTDmdNode.TYPE_BASIC: 
     462            sb.append(type.toCharArray()); 
     463            break; 
     464        case ASTDmdNode.TYPE_D_ARRAY: 
     465            appendReadableName(type.next, sb); 
     466            if (sb.length() == 0 || sb.charAt(sb.length() - 1) != 's') { 
     467                sb.append('s'); 
     468            } 
     469            break; 
     470        case ASTDmdNode.TYPE_DELEGATE: 
     471            appendReadableName(type.next, sb); 
     472            sb.append("Dg"); 
     473            break; 
     474        case ASTDmdNode.TYPE_DOT_ID_EXP: 
     475            sb.append(type.toCharArray()); 
     476            break; 
     477        case ASTDmdNode.TYPE_FUNCTION: 
     478            appendReadableName(type.next, sb); 
     479            break; 
     480        case ASTDmdNode.TYPE_IDENTIFIER: 
     481            sb.append(type.toCharArray()); 
     482            break; 
     483        case ASTDmdNode.TYPE_INSTANCE: 
     484            TypeInstance ti = (TypeInstance) type; 
     485            sb.append(ti.tempinst.name); 
     486            break; 
     487        case ASTDmdNode.TYPE_POINTER: 
     488            if (type.next.getNodeType() == ASTDmdNode.TYPE_FUNCTION) { 
     489                appendReadableName(type.next.next, sb); 
     490                sb.append("Func"); 
     491            } else { 
     492                sb.append('p'); 
     493                appendUppercaseReadableName(type.next, sb); 
     494            } 
     495            break; 
     496        case ASTDmdNode.TYPE_S_ARRAY: 
     497            appendReadableName(type.next, sb); 
     498            if (sb.length() == 0 || sb.charAt(sb.length() - 1) != 's') { 
     499                sb.append('s'); 
     500            } 
     501            break; 
     502        case ASTDmdNode.TYPE_SLICE: 
     503            appendReadableName(type.next, sb); 
     504            break; 
     505        case ASTDmdNode.TYPE_TYPEOF: 
     506            sb.append("typeof"); 
     507            break; 
     508        } 
     509    } 
     510     
     511    private static final void appendUppercaseReadableName(Type type, StringBuilder sb) { 
     512        StringBuilder sb2 = new StringBuilder(); 
     513        appendReadableName(type, sb2); 
     514        if (sb2.length() > 0) { 
     515            sb2.setCharAt(0, Character.toUpperCase(sb2.charAt(0))); 
     516        } 
     517        sb.append(sb2); 
     518    } 
     519     
    434520} 
  • trunk/descent.tests/descent/tests/assist

    • Property svn:ignore set to
      *.class