提交 fb1937f1 编写于 作者: S sadayapalam

8145466: javac: No line numbers in compilation error

Summary: Compiler should not use the syntax tree from enclosing contexts in diagnostics even when the enclosing contexts are consulted for method lookup.
Reviewed-by: mcimadamore
上级 688f816e
......@@ -25,6 +25,7 @@
package com.sun.tools.javac.comp;
import com.sun.tools.javac.tree.JCTree;
import com.sun.tools.javac.util.*;
import com.sun.tools.javac.code.*;
......@@ -80,6 +81,13 @@ public class AttrContext {
*/
Type defaultSuperCallSite = null;
/** Tree that when non null, is to be preferentially used in diagnostics.
* Usually Env<AttrContext>.tree is the tree to be referred to in messages,
* but this may not be true during the window a method is looked up in enclosing
* contexts (JDK-8145466)
*/
JCTree preferredTreeForDiagnostics;
/** Duplicate this context, replacing scope field and copying all others.
*/
AttrContext dup(Scope scope) {
......@@ -94,6 +102,7 @@ public class AttrContext {
info.returnResult = returnResult;
info.defaultSuperCallSite = defaultSuperCallSite;
info.isSerializable = isSerializable;
info.preferredTreeForDiagnostics = preferredTreeForDiagnostics;
return info;
}
......
......@@ -717,7 +717,8 @@ public class Resolve {
Warner warn) {
//should we expand formals?
boolean useVarargs = deferredAttrContext.phase.isVarargsRequired();
List<JCExpression> trees = TreeInfo.args(env.tree);
JCTree callTree = treeForDiagnostics(env);
List<JCExpression> trees = TreeInfo.args(callTree);
//inference context used during this method check
InferenceContext inferenceContext = deferredAttrContext.inferenceContext;
......@@ -726,7 +727,7 @@ public class Resolve {
if (varargsFormal == null &&
argtypes.size() != formals.size()) {
reportMC(env.tree, MethodCheckDiag.ARITY_MISMATCH, inferenceContext); // not enough args
reportMC(callTree, MethodCheckDiag.ARITY_MISMATCH, inferenceContext); // not enough args
}
while (argtypes.nonEmpty() && formals.head != varargsFormal) {
......@@ -738,7 +739,7 @@ public class Resolve {
}
if (formals.head != varargsFormal) {
reportMC(env.tree, MethodCheckDiag.ARITY_MISMATCH, inferenceContext); // not enough args
reportMC(callTree, MethodCheckDiag.ARITY_MISMATCH, inferenceContext); // not enough args
}
if (useVarargs) {
......@@ -754,6 +755,11 @@ public class Resolve {
}
}
// where
private JCTree treeForDiagnostics(Env<AttrContext> env) {
return env.info.preferredTreeForDiagnostics != null ? env.info.preferredTreeForDiagnostics : env.tree;
}
/**
* Does the actual argument conforms to the corresponding formal?
*/
......@@ -1828,17 +1834,23 @@ public class Resolve {
boolean staticOnly = false;
while (env1.outer != null) {
if (isStatic(env1)) staticOnly = true;
sym = findMethod(
env1, env1.enclClass.sym.type, name, argtypes, typeargtypes,
allowBoxing, useVarargs, false);
if (sym.exists()) {
if (staticOnly &&
sym.kind == MTH &&
sym.owner.kind == TYP &&
(sym.flags() & STATIC) == 0) return new StaticError(sym);
else return sym;
} else if (sym.kind < bestSoFar.kind) {
bestSoFar = sym;
Assert.check(env1.info.preferredTreeForDiagnostics == null);
env1.info.preferredTreeForDiagnostics = env.tree;
try {
sym = findMethod(
env1, env1.enclClass.sym.type, name, argtypes, typeargtypes,
allowBoxing, useVarargs, false);
if (sym.exists()) {
if (staticOnly &&
sym.kind == MTH &&
sym.owner.kind == TYP &&
(sym.flags() & STATIC) == 0) return new StaticError(sym);
else return sym;
} else if (sym.kind < bestSoFar.kind) {
bestSoFar = sym;
}
} finally {
env1.info.preferredTreeForDiagnostics = null;
}
if ((env1.enclClass.sym.flags() & STATIC) != 0) staticOnly = true;
env1 = env1.outer;
......@@ -4214,7 +4226,11 @@ public class Resolve {
DiagnosticPosition preferedPos, DiagnosticSource preferredSource,
DiagnosticType preferredKind, JCDiagnostic d) {
JCDiagnostic cause = (JCDiagnostic)d.getArgs()[0];
return diags.create(preferredKind, preferredSource, d.getDiagnosticPosition(),
DiagnosticPosition pos = d.getDiagnosticPosition();
if (pos == null) {
pos = preferedPos;
}
return diags.create(preferredKind, preferredSource, pos,
"prob.found.req", cause);
}
});
......
/*
* @test /nodynamiccopyright/
* @bug 8145466 8146533
* @summary javac: No line numbers in compilation error
* @compile/fail/ref=DiagnosticRewriterTest.out -Xdiags:compact -XDrawDiagnostics DiagnosticRewriterTest.java
*/
class DiagnosticRewriterTest {
void test() {
new Object() {
void g() {
m(2L);
}
};
}
void m(int i) { }
}
DiagnosticRewriterTest.java:12:15: compiler.err.prob.found.req: (compiler.misc.possible.loss.of.precision: long, int)
- compiler.note.compressed.diags
1 error
/*
* @test /nodynamiccopyright/
* @bug 8145466 8146533
* @summary javac: No line numbers in compilation error
* @compile/fail/ref=DiagnosticRewriterTest2.out -Xdiags:compact -XDrawDiagnostics DiagnosticRewriterTest2.java
*/
class DiagnosticRewriterTest2 {
class Bar {
Bar(Object o) { }
}
void test() {
new Bar(null) {
void g() {
m(2L);
m();
}
};
}
void m(int i) { }
}
DiagnosticRewriterTest2.java:15:15: compiler.err.prob.found.req: (compiler.misc.possible.loss.of.precision: long, int)
DiagnosticRewriterTest2.java:16:13: compiler.err.cant.apply.symbol: kindname.method, m, int, compiler.misc.no.args, kindname.class, DiagnosticRewriterTest2, (compiler.misc.arg.length.mismatch)
- compiler.note.compressed.diags
2 errors
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册