Changeset 858
- Timestamp:
- 10/21/07 15:36:45 (1 year ago)
- Files:
-
- trunk/descent.core/src/descent/internal/codeassist/CompletionEngine.java (modified) (2 diffs)
- trunk/descent.core/src/descent/internal/codeassist/complete/CompletionParser.java (modified) (5 diffs)
- trunk/descent.core/src/descent/internal/compiler/parser/Argument.java (modified) (1 diff)
- trunk/descent.core/src/descent/internal/compiler/parser/Parser.java (modified) (2 diffs)
- trunk/descent.core/src/descent/internal/core/InternalNamingConventions.java (modified) (3 diffs)
- trunk/descent.tests/descent/tests/assist (modified) (1 prop)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/descent.core/src/descent/internal/codeassist/CompletionEngine.java
r856 r858 18 18 import descent.internal.compiler.env.ICompilationUnit; 19 19 import descent.internal.compiler.parser.ASTDmdNode; 20 import descent.internal.compiler.parser.Argument; 21 import descent.internal.compiler.parser.Type; 22 import descent.internal.compiler.parser.TypeFunction; 20 23 import descent.internal.compiler.util.HashtableOfObject; 24 import descent.internal.core.INamingRequestor; 25 import descent.internal.core.InternalNamingConventions; 21 26 import descent.internal.core.SearchableEnvironment; 22 27 … … 195 200 196 201 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); 198 296 } 199 297 trunk/descent.core/src/descent/internal/codeassist/complete/CompletionParser.java
r856 r858 23 23 private ASTDmdNode assistNode; 24 24 private List<ICompletionOnKeyword> keywordCompletions; 25 private boolean includeExpectations = true; 25 26 26 27 public CompletionParser(int apiLevel, char[] source) { … … 42 43 43 44 if (start <= cursorLocation && cursorLocation <= end) { 45 includeExpectations = false; 46 44 47 assistNode = new CompletionOnModuleDeclaration(packages, module, cursorLocation); 45 48 return (ModuleDeclaration) assistNode; … … 55 58 56 59 if (start <= cursorLocation && cursorLocation <= end) { 60 includeExpectations = false; 61 57 62 assistNode = new CompletionOnImport(loc, packages, module, aliasid, isstatic, cursorLocation); 58 63 return (Import) assistNode; … … 64 69 @Override 65 70 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 67 75 assistNode = new CompletionOnArgumentName(storageClass, at, ai, ae); 68 76 return (Argument) assistNode; … … 74 82 @Override 75 83 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) { 77 92 if (keywordCompletions == null) { 78 93 keywordCompletions = new ArrayList<ICompletionOnKeyword>(); trunk/descent.core/src/descent/internal/compiler/parser/Argument.java
r818 r858 177 177 public IdentifierExp ident; 178 178 public Expression defaultArg, sourceDefaultArg; 179 public TypeFunction parentType; // Added field to keep track of the argument's parent 179 180 180 181 public Argument(int storageClass, Type type, IdentifierExp ident, trunk/descent.core/src/descent/internal/compiler/parser/Parser.java
r856 r858 2619 2619 2620 2620 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 2621 2629 if (save == TOKdelegate) { 2622 2630 t = new TypeDelegate(t); … … 2751 2759 2752 2760 int[] pointer2_varargs = { varargs }; 2753 arguments = parseParameters(pointer2_varargs); 2761 arguments = parseParameters(pointer2_varargs); 2754 2762 varargs = pointer2_varargs[0]; 2755 2763 2756 2764 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 2757 2773 ta.setSourceRange(t.start, t.length); 2758 2774 trunk/descent.core/src/descent/internal/core/InternalNamingConventions.java
r210 r858 22 22 import descent.internal.codeassist.impl.AssistOptions; 23 23 import descent.internal.compiler.impl.CompilerOptions; 24 import descent.internal.compiler.parser.ASTDmdNode; 24 25 import descent.internal.compiler.parser.ScannerHelper; 26 import descent.internal.compiler.parser.Type; 27 import descent.internal.compiler.parser.TypeAArray; 28 import descent.internal.compiler.parser.TypeInstance; 29 import descent.internal.compiler.parser.TypeSlice; 25 30 26 31 public class InternalNamingConventions { … … 303 308 boolean previousIsLetter = true; 304 309 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; 306 311 boolean isLetter = ScannerHelper.isLetter(sourceName[i]); 307 if(isUpperCase && !previousIsUpperCase &&previousIsLetter){312 if(isUpperCase && /* !previousIsUpperCase && */ previousIsLetter){ 308 313 char[] name = CharOperation.subarray(sourceName,i,sourceName.length); 309 314 if(name.length > 1){ … … 432 437 return true; 433 438 } 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 434 520 } trunk/descent.tests/descent/tests/assist
- Property svn:ignore set to
*.class
- Property svn:ignore set to
