8189796: Incorrect end position for missing statement
Recording end positions for error trees representing missing statements. Co-authored-by: Dusan Balek <dusan.balek@oracle.com> Reviewed-by: mcimadamore
This commit is contained in:
parent
ed0ea37394
commit
a663434be7
@ -2396,9 +2396,8 @@ public class JavacParser implements Parser {
|
|||||||
int pos = token.pos;
|
int pos = token.pos;
|
||||||
List<JCStatement> stats = blockStatement();
|
List<JCStatement> stats = blockStatement();
|
||||||
if (stats.isEmpty()) {
|
if (stats.isEmpty()) {
|
||||||
JCErroneous e = F.at(pos).Erroneous();
|
JCErroneous e = syntaxError(pos, "illegal.start.of.stmt");
|
||||||
error(e, "illegal.start.of.stmt");
|
return toP(F.at(pos).Exec(e));
|
||||||
return F.at(pos).Exec(e);
|
|
||||||
} else {
|
} else {
|
||||||
JCStatement first = stats.head;
|
JCStatement first = stats.head;
|
||||||
String error = null;
|
String error = null;
|
||||||
|
@ -38,6 +38,7 @@ import com.sun.source.tree.CompilationUnitTree;
|
|||||||
import com.sun.source.tree.ErroneousTree;
|
import com.sun.source.tree.ErroneousTree;
|
||||||
import com.sun.source.tree.ExpressionStatementTree;
|
import com.sun.source.tree.ExpressionStatementTree;
|
||||||
import com.sun.source.tree.ExpressionTree;
|
import com.sun.source.tree.ExpressionTree;
|
||||||
|
import com.sun.source.tree.IfTree;
|
||||||
import com.sun.source.tree.LambdaExpressionTree;
|
import com.sun.source.tree.LambdaExpressionTree;
|
||||||
import com.sun.source.tree.MethodInvocationTree;
|
import com.sun.source.tree.MethodInvocationTree;
|
||||||
import com.sun.source.tree.MethodTree;
|
import com.sun.source.tree.MethodTree;
|
||||||
@ -284,6 +285,48 @@ public class JavacParserTest extends TestCase {
|
|||||||
1, t.getSourcePositions().getStartPosition(cut, clazz));
|
1, t.getSourcePositions().getStartPosition(cut, clazz));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testPositionMissingStatement() throws IOException {
|
||||||
|
String code = "class C { void t() { if (true) } }";
|
||||||
|
DiagnosticCollector<JavaFileObject> dc = new DiagnosticCollector<>();
|
||||||
|
|
||||||
|
JavacTaskImpl ct = (JavacTaskImpl) tool.getTask(null, fm, dc, null,
|
||||||
|
null, Arrays.asList(new MyFileObject(code)));
|
||||||
|
|
||||||
|
CompilationUnitTree cut = ct.parse().iterator().next();
|
||||||
|
Trees trees = Trees.instance(ct);
|
||||||
|
SourcePositions positions = trees.getSourcePositions();
|
||||||
|
|
||||||
|
new TreeScanner<Void, Void>() {
|
||||||
|
@Override
|
||||||
|
public Void visitIf(IfTree it, Void v) {
|
||||||
|
StatementTree st = it.getThenStatement();
|
||||||
|
int startpos = (int) positions.getStartPosition(cut, st);
|
||||||
|
int endpos = (int) positions.getEndPosition(cut, st);
|
||||||
|
assertEquals("testPositionMissingStatement.execpos", startpos, endpos);
|
||||||
|
assertEquals("testPositionMissingStatement.execkind",
|
||||||
|
Kind.EXPRESSION_STATEMENT,
|
||||||
|
st.getKind());
|
||||||
|
Tree err = ((ExpressionStatementTree) st).getExpression();
|
||||||
|
startpos = (int) positions.getStartPosition(cut, err);
|
||||||
|
endpos = (int) positions.getEndPosition(cut, err);
|
||||||
|
assertEquals("testPositionMissingStatement.errpos", startpos, endpos);
|
||||||
|
assertEquals("testPositionMissingStatement.errkind",
|
||||||
|
Kind.ERRONEOUS,
|
||||||
|
err.getKind());
|
||||||
|
return super.visitIf(it, v);
|
||||||
|
}
|
||||||
|
}.scan(cut, null);
|
||||||
|
|
||||||
|
assertEquals("testPositionMissingStatement.diags", 1, dc.getDiagnostics().size());
|
||||||
|
Diagnostic<? extends JavaFileObject> d = dc.getDiagnostics().get(0);
|
||||||
|
int startpos = (int) d.getStartPosition();
|
||||||
|
int pos = (int) d.getPosition();
|
||||||
|
int endpos = (int) d.getEndPosition();
|
||||||
|
assertEquals("testPositionMissingStatement.diagspan", startpos, endpos);
|
||||||
|
assertEquals("testPositionMissingStatement.diagpref", startpos, pos);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void testPositionsSane1() throws IOException {
|
void testPositionsSane1() throws IOException {
|
||||||
performPositionsSanityTest("package test; class Test { " +
|
performPositionsSanityTest("package test; class Test { " +
|
||||||
|
Loading…
Reference in New Issue
Block a user