mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-15 16:44:36 +02:00
8273263: Incorrect recovery attribution of record component type when j.l.Record is unavailable
Reviewed-by: vromero
This commit is contained in:
parent
fa9c8657df
commit
f17ee0c5c7
3 changed files with 51 additions and 2 deletions
|
@ -552,6 +552,16 @@ public class TypeEnter implements Completer {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Generate a base clause for a record type.
|
||||||
|
* @param pos The position for trees and diagnostics, if any
|
||||||
|
* @param c The class symbol of the record
|
||||||
|
*/
|
||||||
|
protected JCExpression recordBase(int pos, ClassSymbol c) {
|
||||||
|
JCExpression result = make.at(pos).
|
||||||
|
QualIdent(syms.recordType.tsym);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
protected Type modelMissingTypes(Env<AttrContext> env, Type t, final JCExpression tree, final boolean interfaceExpected) {
|
protected Type modelMissingTypes(Env<AttrContext> env, Type t, final JCExpression tree, final boolean interfaceExpected) {
|
||||||
if (!t.hasTag(ERROR))
|
if (!t.hasTag(ERROR))
|
||||||
return t;
|
return t;
|
||||||
|
@ -694,7 +704,10 @@ public class TypeEnter implements Completer {
|
||||||
true, false, false)
|
true, false, false)
|
||||||
: (sym.fullname == names.java_lang_Object)
|
: (sym.fullname == names.java_lang_Object)
|
||||||
? Type.noType
|
? Type.noType
|
||||||
: sym.isRecord() ? syms.recordType : syms.objectType;
|
: sym.isRecord()
|
||||||
|
? attr.attribBase(recordBase(tree.pos, sym), baseEnv,
|
||||||
|
true, false, false)
|
||||||
|
: syms.objectType;
|
||||||
}
|
}
|
||||||
ct.supertype_field = modelMissingTypes(baseEnv, supertype, extending, false);
|
ct.supertype_field = modelMissingTypes(baseEnv, supertype, extending, false);
|
||||||
|
|
||||||
|
|
|
@ -58,9 +58,14 @@ public class TestGetElementReference {
|
||||||
analyze(false, "TestGetElementReferenceData.java");
|
analyze(false, "TestGetElementReferenceData.java");
|
||||||
analyze(false, "mod/module-info.java", "mod/api/pkg/Api.java");
|
analyze(false, "mod/module-info.java", "mod/api/pkg/Api.java");
|
||||||
analyze(true, "TestGetElementReferenceDataWithErrors.java");
|
analyze(true, "TestGetElementReferenceDataWithErrors.java");
|
||||||
|
analyze(true, new String[] {"--release", "8", "-XDshould-stop.at=FLOW"}, "TestGetElementReferenceDataWithRecord.java");
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void analyze(boolean allowErrors, String... fileNames) throws IOException {
|
private static void analyze(boolean allowErrors, String... fileNames) throws IOException {
|
||||||
|
analyze(allowErrors, new String[0], fileNames);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void analyze(boolean allowErrors, String[] extraParams, String... fileNames) throws IOException {
|
||||||
try (StandardJavaFileManager fm = ToolProvider.getSystemJavaCompiler().getStandardFileManager(null, null, null)) {
|
try (StandardJavaFileManager fm = ToolProvider.getSystemJavaCompiler().getStandardFileManager(null, null, null)) {
|
||||||
List<JavaFileObject> files = new ArrayList<>();
|
List<JavaFileObject> files = new ArrayList<>();
|
||||||
for (String fileName : fileNames) {
|
for (String fileName : fileNames) {
|
||||||
|
@ -70,7 +75,9 @@ public class TestGetElementReference {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<>();
|
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<>();
|
||||||
List<String> options = List.of("-Xjcov");
|
List<String> options = new ArrayList<>();
|
||||||
|
options.add("-Xjcov");
|
||||||
|
options.addAll(List.of(extraParams));
|
||||||
JavacTask ct = (JavacTask) ToolProvider.getSystemJavaCompiler().getTask(null, null, diagnostics, options, null, files);
|
JavacTask ct = (JavacTask) ToolProvider.getSystemJavaCompiler().getTask(null, null, diagnostics, options, null, files);
|
||||||
Trees trees = Trees.instance(ct);
|
Trees trees = Trees.instance(ct);
|
||||||
CompilationUnitTree cut = ct.parse().iterator().next();
|
CompilationUnitTree cut = ct.parse().iterator().next();
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package test;
|
||||||
|
|
||||||
|
public record TestGetElementReferenceDataWithRecord(String/*getElement:CLASS:java.lang.String*/ s1,
|
||||||
|
String/*getElement:CLASS:java.lang.String*/ s2) implements I {}
|
||||||
|
|
||||||
|
interface I {}
|
Loading…
Add table
Add a link
Reference in a new issue