From 963b42221e19dca8296e4a19cc3cbddd40dc0c56 Mon Sep 17 00:00:00 2001 From: Gayan Perera Date: Fri, 17 Feb 2023 20:30:38 +0100 Subject: [PATCH] Guard the new CompletionOnRecordComponentName.#757 Add proper guard condition for CompletionOnRecordComponentName so that it is created only if the cursor location is in-between the record declaration start and name end position. --- .../jdt/internal/compiler/parser/Parser.java | 5 ++-- .../core/tests/model/CompletionTests14.java | 24 +++++++++++++++++++ .../codeassist/complete/CompletionParser.java | 7 +++--- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/Parser.java b/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/Parser.java index 53135c81bcd..5a14b14736f 100644 --- a/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/Parser.java +++ b/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/parser/Parser.java @@ -11394,7 +11394,7 @@ protected void consumeRecordComponent(boolean isVarArgs) { RecordComponent recordComponent; recordComponent = createComponent(identifierName, namePositions, type, this.intStack[this.intPtr--] & ~ClassFileConstants.AccDeprecated // modifiers - ); + , modifierPositions); recordComponent.declarationSourceStart = modifierPositions; recordComponent.bits |= (type.bits & ASTNode.HasTypeAnnotations); // consume annotations @@ -11716,7 +11716,8 @@ protected FieldDeclaration createFieldDeclaration(char[] fieldDeclarationName, i return new FieldDeclaration(fieldDeclarationName, sourceStart, sourceEnd); } -protected RecordComponent createComponent(char[] identifierName, long namePositions, TypeReference type, int modifier) { +protected RecordComponent createComponent(char[] identifierName, long namePositions, TypeReference type, int modifier, + int declStart) { return new RecordComponent(identifierName, namePositions, type, modifier); } protected JavadocParser createJavadocParser() { diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests14.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests14.java index 35348e59c82..5ad0fd97322 100644 --- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests14.java +++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests14.java @@ -578,4 +578,28 @@ public void testGH667_CompletionOnRecordComponent_VariableName() throws JavaMode requestor.getResults()); } + public void testGH757_CompletionOnTypeNameAboveRecordDeclaration() throws JavaModelException { + this.workingCopies = new ICompilationUnit[2]; + this.workingCopies[0] = getWorkingCopy( + "/Completion/src/Person.java", + "public class Person {\n" + + "private Name name = new Name \n" + + "record Age(int value){};" + + "}\n"); + this.workingCopies[1] = getWorkingCopy( + "/Completion/src/Name.java", + "public class Name {\n" + + "}\n"); + CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true, true, true, false); + String str = this.workingCopies[0].getSource(); + String completeBehind = "new Name"; + int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length(); + this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner); + assertResults( + "Name[TYPE_REF]{Name, , LName;, null, null, null, null, [46, 50], " + + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_UNQUALIFIED + R_NON_RESTRICTED + + R_EXACT_NAME + R_EXACT_EXPECTED_TYPE) + + "}", + requestor.getResults()); + } } diff --git a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionParser.java b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionParser.java index 2e907bb4a09..2e75f928f50 100644 --- a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionParser.java +++ b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionParser.java @@ -6327,12 +6327,13 @@ protected FieldDeclaration createFieldDeclaration(char[] assistName, int sourceS } @Override -protected RecordComponent createComponent(char[] identifierName, long namePositions, TypeReference type, int modifier) { +protected RecordComponent createComponent(char[] identifierName, long namePositions, TypeReference type, int modifier, + int declStart) { int endPos = (int) namePositions; - if (this.cursorLocation <= endPos) { + if (this.cursorLocation > declStart && this.cursorLocation <= endPos) { return new CompletionOnRecordComponentName(identifierName, namePositions, type, modifier); } - return super.createComponent(identifierName, namePositions, type, modifier); + return super.createComponent(identifierName, namePositions, type, modifier, declStart); } /*