3333import org .eclipse .jdt .internal .compiler .env .AccessRestriction ;
3434import org .eclipse .jdt .internal .compiler .lookup .TypeConstants ;
3535import org .eclipse .jdt .internal .compiler .parser .RecoveryScanner ;
36+ import org .eclipse .jdt .internal .compiler .util .HashtableOfObject ;
3637import org .eclipse .jdt .internal .core .JarPackageFragmentRoot ;
3738import org .eclipse .jdt .internal .core .JavaElementRequestor ;
3839import org .eclipse .jdt .internal .core .JavaModelManager ;
@@ -69,7 +70,6 @@ public class DOMCompletionEngine implements Runnable {
6970 private final AssistOptions assistOptions ;
7071 private final SearchPattern pattern ;
7172
72- private final CompletionEngine nestedEngine ; // to reuse some utilities
7373 private ExpectedTypes expectedTypes ;
7474 private String prefix ;
7575 private String qualifiedPrefix ;
@@ -79,6 +79,11 @@ public class DOMCompletionEngine implements Runnable {
7979 private final DOMCompletionEngineRecoveredNodeScanner recoveredNodeScanner ;
8080 private final IProgressMonitor monitor ;
8181
82+ public HashtableOfObject typeCache ;
83+ public int openedBinaryTypes ; // used during InternalCompletionProposal#findConstructorParameterNames()
84+ private AssistOptions modelUnitOptions ;
85+
86+
8287 static class Bindings {
8388 // those need to be list since the order matters
8489 // fields must be before methods
@@ -113,6 +118,7 @@ public DOMCompletionEngine(int offset, CompilationUnit domUnit, ICompilationUnit
113118 this .offset = offset ;
114119 this .unit = domUnit ;
115120 this .modelUnit = modelUnit ;
121+ this .modelUnitOptions = new AssistOptions (this .modelUnit .getOptions (true ));
116122 this .requestor = requestor ;
117123 SearchableEnvironment env = null ;
118124 if (this .modelUnit .getJavaProject () instanceof JavaProject p && requestor != null ) {
@@ -135,7 +141,9 @@ public DOMCompletionEngine(int offset, CompilationUnit domUnit, ICompilationUnit
135141 // TODO also honor requestor.ignore*
136142 // TODO sorting/relevance: closest/prefix match should go first
137143 // ...
138- this .nestedEngine = new CompletionEngine (this .nameEnvironment , this .requestor , this .modelUnit .getOptions (true ), this .modelUnit .getJavaProject (), workingCopyOwner , monitor );
144+ this .typeCache = new HashtableOfObject (5 );
145+ this .openedBinaryTypes = 0 ;
146+
139147 this .variableDeclHandler = new DOMCompletionEngineVariableDeclHandler ();
140148 this .recoveredNodeScanner = new DOMCompletionEngineRecoveredNodeScanner (modelUnit , offset );
141149 this .monitor = monitor ;
@@ -2059,7 +2067,7 @@ private CompletionProposal toProposal(IBinding binding, String completion) {
20592067 }
20602068 }
20612069
2062- InternalCompletionProposal res = new InternalCompletionProposal ( kind , this .offset );
2070+ DOMEngineProposal res = new DOMEngineProposal ( this , kind , this .offset );
20632071 res .setName (binding .getName ().toCharArray ());
20642072 if (kind == CompletionProposal .METHOD_REF ) {
20652073 completion += "()" ; //$NON-NLS-1$
@@ -2239,12 +2247,11 @@ private CompletionProposal toProposal(IBinding binding, String completion) {
22392247 res .setDeclarationTypeName (((IType )element .getAncestor (IJavaElement .TYPE )).getFullyQualifiedName ().toCharArray ());
22402248 res .setDeclarationPackageName (element .getAncestor (IJavaElement .PACKAGE_FRAGMENT ).getElementName ().toCharArray ());
22412249 }
2242- res .completionEngine = this .nestedEngine ;
22432250 res .nameLookup = this .nameEnvironment .nameLookup ;
22442251
22452252 res .setRelevance (CompletionEngine .computeBaseRelevance () +
22462253 CompletionEngine .computeRelevanceForResolution () +
2247- this . nestedEngine . computeRelevanceForInterestingProposal () +
2254+ computeRelevanceForInterestingProposal () +
22482255 (res .isConstructor ? 0 : CompletionEngine .computeRelevanceForCaseMatching (this .prefix .toCharArray (), binding .getName ().toCharArray (), this .assistOptions )) +
22492256 computeRelevanceForExpectingType (binding instanceof ITypeBinding typeBinding ? typeBinding :
22502257 binding instanceof IMethodBinding methodBinding ? methodBinding .getReturnType () :
@@ -2292,7 +2299,7 @@ private String qualifiedTypeName(ITypeBinding typeBinding) {
22922299 }
22932300
22942301 private CompletionProposal toProposal (IType type ) {
2295- InternalCompletionProposal res = new InternalCompletionProposal ( CompletionProposal .TYPE_REF , this .offset );
2302+ DOMEngineProposal res = new DOMEngineProposal ( this , CompletionProposal .TYPE_REF , this .offset );
22962303 char [] simpleName = type .getElementName ().toCharArray ();
22972304 char [] signature = Signature .createTypeSignature (type .getFullyQualifiedName (), true ).toCharArray ();
22982305
@@ -2386,7 +2393,6 @@ private CompletionProposal toProposal(IType type) {
23862393 } catch (JavaModelException e ) {
23872394 // there are sensible default set if accessing the model fails
23882395 }
2389- res .completionEngine = this .nestedEngine ;
23902396 res .nameLookup = this .nameEnvironment .nameLookup ;
23912397 int relevance = RelevanceConstants .R_DEFAULT
23922398 + RelevanceConstants .R_RESOLVED
@@ -2742,11 +2748,10 @@ private CompletionProposal toAnonymousConstructorProposal(IType type) {
27422748 }
27432749
27442750 private CompletionProposal toImportProposal (char [] simpleName , char [] signature , char [] packageName ) {
2745- InternalCompletionProposal res = new InternalCompletionProposal ( CompletionProposal .TYPE_IMPORT , this .offset );
2751+ InternalCompletionProposal res = new DOMEngineProposal ( this , CompletionProposal .TYPE_IMPORT , this .offset );
27462752 res .setName (simpleName );
27472753 res .setSignature (signature );
27482754 res .setPackageName (packageName );
2749- res .completionEngine = this .nestedEngine ;
27502755 res .nameLookup = this .nameEnvironment .nameLookup ;
27512756 return res ;
27522757 }
@@ -3056,9 +3061,9 @@ private CompletionProposal toModuleCompletion(String moduleName, char[] prefix,
30563061 char [] completion = moduleName .toCharArray ();
30573062 int relevance = CompletionEngine .computeBaseRelevance ();
30583063 relevance += CompletionEngine .computeRelevanceForResolution ();
3059- relevance += this . nestedEngine . computeRelevanceForInterestingProposal ();
3060- relevance += this . nestedEngine . computeRelevanceForCaseMatching (prefix , completion );
3061- relevance += this . nestedEngine . computeRelevanceForQualification (true );
3064+ relevance += computeRelevanceForInterestingProposal ();
3065+ relevance += CompletionEngine . computeRelevanceForCaseMatching (prefix , completion , this . modelUnitOptions );
3066+ relevance += computeRelevanceForQualification (true );
30623067 if (requiredModules .contains (moduleName )) {
30633068 relevance += CompletionEngine .computeRelevanceForRestrictions (IAccessRule .K_ACCESSIBLE );
30643069 }
@@ -3085,16 +3090,44 @@ private CompletionProposal toModuleCompletion(String moduleName, char[] prefix,
30853090 * @return an internal completion proposal of the given kind
30863091 */
30873092 protected InternalCompletionProposal createProposal (int kind ) {
3088- InternalCompletionProposal proposal = new DOMInternalCompletionProposal (kind , this .offset );
3093+ InternalCompletionProposal proposal = new DOMInternalCompletionProposal (this , kind , this .offset );
30893094 proposal .nameLookup = this .nameEnvironment .nameLookup ;
3090- proposal .completionEngine = this .nestedEngine ;
30913095 return proposal ;
30923096 }
30933097
3094- private static class DOMInternalCompletionProposal extends InternalCompletionProposal {
3095-
3096- public DOMInternalCompletionProposal ( int kind , int completionLocation ) {
3098+ private static class DOMEngineProposal extends InternalCompletionProposal {
3099+ private DOMCompletionEngine engine ;
3100+ public DOMEngineProposal ( DOMCompletionEngine engine , int kind , int completionLocation ) {
30973101 super (kind , completionLocation );
3102+ this .engine = engine ;
3103+ }
3104+
3105+ @ Override
3106+ protected void incrementOpenedBinaryTypesCount () {
3107+ this .engine .openedBinaryTypes ++;
3108+ }
3109+
3110+ @ Override
3111+ protected int getOpenedBinaryTypesCount () {
3112+ return this .engine .openedBinaryTypes ;
3113+ }
3114+
3115+ @ Override
3116+ protected void addToCompletionEngineTypeCache (char [] tName , IType type ) {
3117+ this .engine .typeCache .put (tName , type );
3118+ }
3119+
3120+ @ Override
3121+ protected Object getFromEngineTypeCache (char [] tName ) {
3122+ return this .engine .typeCache .get (tName );
3123+ }
3124+
3125+ }
3126+
3127+ private static class DOMInternalCompletionProposal extends DOMEngineProposal {
3128+
3129+ public DOMInternalCompletionProposal (DOMCompletionEngine engine , int kind , int completionLocation ) {
3130+ super (engine , kind , completionLocation );
30983131 }
30993132
31003133 @ Override
@@ -3318,4 +3351,11 @@ private ITypeBinding getDeclaringClass(IBinding binding) {
33183351 binding instanceof IVariableBinding variableBinding && variableBinding .isField () ? variableBinding .getDeclaringClass () :
33193352 null ;
33203353 }
3354+
3355+ int computeRelevanceForInterestingProposal (){
3356+ return RelevanceConstants .R_INTERESTING ;
3357+ }
3358+ int computeRelevanceForResolution (){
3359+ return RelevanceConstants .R_RESOLVED ;
3360+ }
33213361}
0 commit comments