8199744: Incorrect compiler message for ReceiverParameter in inner class constructor
Reviewed-by: mcimadamore
This commit is contained in:
parent
2f100464ea
commit
92ec4c52a8
src/jdk.compiler/share/classes/com/sun/tools/javac
test/langtools/tools/javac
T8199744
lambda/8131742
@ -3106,35 +3106,34 @@ public class JavacParser implements Parser {
|
||||
name = token.name();
|
||||
nextToken();
|
||||
} else {
|
||||
if (allowThisIdent && !lambdaParameter) {
|
||||
if (allowThisIdent ||
|
||||
!lambdaParameter ||
|
||||
LAX_IDENTIFIER.accepts(token.kind) ||
|
||||
mods.flags != Flags.PARAMETER ||
|
||||
mods.annotations.nonEmpty()) {
|
||||
JCExpression pn = qualident(false);
|
||||
if (pn.hasTag(Tag.IDENT) && ((JCIdent)pn).name != names._this) {
|
||||
name = ((JCIdent)pn).name;
|
||||
} else {
|
||||
if ((mods.flags & Flags.VARARGS) != 0) {
|
||||
log.error(token.pos, Errors.VarargsAndReceiver);
|
||||
}
|
||||
if (token.kind == LBRACKET) {
|
||||
log.error(token.pos, Errors.ArrayAndReceiver);
|
||||
if (allowThisIdent) {
|
||||
if ((mods.flags & Flags.VARARGS) != 0) {
|
||||
log.error(token.pos, Errors.VarargsAndReceiver);
|
||||
}
|
||||
if (token.kind == LBRACKET) {
|
||||
log.error(token.pos, Errors.ArrayAndReceiver);
|
||||
}
|
||||
}
|
||||
return toP(F.at(pos).ReceiverVarDef(mods, pn, type));
|
||||
}
|
||||
} else {
|
||||
if (!lambdaParameter ||
|
||||
LAX_IDENTIFIER.accepts(token.kind) ||
|
||||
mods.flags != Flags.PARAMETER ||
|
||||
mods.annotations.nonEmpty()) {
|
||||
name = ident();
|
||||
} else {
|
||||
/** if it is a lambda parameter and the token kind is not an identifier,
|
||||
* and there are no modifiers or annotations, then this means that the compiler
|
||||
* supposed the lambda to be explicit but it can contain a mix of implicit,
|
||||
* var or explicit parameters. So we assign the error name to the parameter name
|
||||
* instead of issuing an error and analyze the lambda parameters as a whole at
|
||||
* a higher level.
|
||||
*/
|
||||
name = names.empty;
|
||||
}
|
||||
/** if it is a lambda parameter and the token kind is not an identifier,
|
||||
* and there are no modifiers or annotations, then this means that the compiler
|
||||
* supposed the lambda to be explicit but it can contain a mix of implicit,
|
||||
* var or explicit parameters. So we assign the error name to the parameter name
|
||||
* instead of issuing an error and analyze the lambda parameters as a whole at
|
||||
* a higher level.
|
||||
*/
|
||||
name = names.empty;
|
||||
}
|
||||
}
|
||||
if ((mods.flags & Flags.VARARGS) != 0 &&
|
||||
@ -3905,7 +3904,7 @@ public class JavacParser implements Parser {
|
||||
JCVariableDecl lastParam;
|
||||
accept(LPAREN);
|
||||
if (token.kind != RPAREN) {
|
||||
this.allowThisIdent = true;
|
||||
this.allowThisIdent = !lambdaParameters;
|
||||
lastParam = formalParameter(lambdaParameters);
|
||||
if (lastParam.nameexpr != null) {
|
||||
this.receiverParam = lastParam;
|
||||
|
@ -2740,7 +2740,8 @@ compiler.err.assert.as.identifier=\
|
||||
|
||||
# TODO 308: make a better error message
|
||||
compiler.err.this.as.identifier=\
|
||||
as of release 8, ''this'' is allowed as the parameter name for the receiver type only, which has to be the first parameter
|
||||
as of release 8, ''this'' is allowed as the parameter name for the receiver type only\n\
|
||||
which has to be the first parameter, and cannot be a lambda parameter
|
||||
|
||||
compiler.err.receiver.parameter.not.applicable.constructor.toplevel.class=\
|
||||
receiver parameter not applicable for constructor of top-level class
|
||||
|
@ -0,0 +1,11 @@
|
||||
/*
|
||||
* @test /nodynamiccopyright/
|
||||
* @bug 8199744
|
||||
* @summary Incorrect compiler message for ReceiverParameter in inner class constructor
|
||||
* @compile/fail/ref=IncorrectMsgQualifiedReceiverTest.out -XDrawDiagnostics IncorrectMsgQualifiedReceiverTest.java
|
||||
*/
|
||||
|
||||
class IncorrectMsgQualifiedReceiverTest {
|
||||
void foo(int any, IncorrectMsgQualifiedReceiverTest IncorrectMsgQualifiedReceiverTest.this) {}
|
||||
void bar(int any, IncorrectMsgQualifiedReceiverTest IncorrectMsgQualifiedReceiverTest.this, int another) {}
|
||||
}
|
@ -0,0 +1,3 @@
|
||||
IncorrectMsgQualifiedReceiverTest.java:9:91: compiler.err.this.as.identifier
|
||||
IncorrectMsgQualifiedReceiverTest.java:10:91: compiler.err.this.as.identifier
|
||||
2 errors
|
@ -1,4 +1,2 @@
|
||||
T8131742.java:8:38: compiler.err.expected3: ',', ')', '['
|
||||
T8131742.java:8:39: compiler.err.this.as.identifier
|
||||
T8131742.java:8:43: compiler.err.expected: ';'
|
||||
3 errors
|
||||
1 error
|
||||
|
Loading…
x
Reference in New Issue
Block a user