Open
Description
Describe the bug
Ideally, there's a one-to-one relationship between a CtElement
and a specific complete CtPath
.
It works well with user-defined classes, but not with a JDK-runtime element.
For example, I can't get CtType
for java.lang.System
from its CtPath
:
#subPackage[name=java]#subPackage[name=lang]#containedType[name=System]
Source code you are trying to analyze/transform
java.lang.System
Source code for your Spoon processing
@Test
public void test() {
CtType<?> ctType = new TypeFactory().get(java.lang.System.class);
System.out.println(ctType.getPath());
CtPath path = new CtPathStringBuilder().fromString("#subPackage[name=java]#subPackage[name=lang]#containedType[name=System]");
List<CtElement> l = path.evaluateOn(model.getRootPackage());
System.out.println(l);
assertTrue(l.iterator().hasNext());
assertEquals(l.iterator().next(), ctType);
}
Actual output
#subPackage[name=java]#subPackage[name=lang]#containedType[name=System]
[]
java.lang.AssertionError
at org.junit.Assert.fail(Assert.java:86)
at org.junit.Assert.assertTrue(Assert.java:41)
at org.junit.Assert.assertTrue(Assert.java:52)
Expected output
#subPackage[name=java]#subPackage[name=lang]#containedType[name=System]
[public final class System {
private System() {
}
private static void initPhase1() {
}
private static int initPhase2(boolean arg0, boolean arg1) {
}
private static void initPhase3() {
}
public static void exit(int arg0) {
}
public static void runFinalization() {
}
public static java.lang.String getProperty(java.lang.String arg0) {
}
public static java.lang.String getProperty(java.lang.String arg0, java.lang.String arg1) {
}
@jdk.internal.HotSpotIntrinsicCandidate
public static native int identityHashCode(java.lang.Object arg0) {
}
@jdk.internal.HotSpotIntrinsicCandidate
public static native long currentTimeMillis() {
}
@jdk.internal.HotSpotIntrinsicCandidate
public static native long nanoTime() {
}
@jdk.internal.HotSpotIntrinsicCandidate
public static native void arraycopy(java.lang.Object arg0, int arg1, java.lang.Object arg2, int arg3, int arg4) {
}
private static native void registerNatives() {
}
public static java.lang.SecurityManager getSecurityManager() {
}
@jdk.internal.reflect.CallerSensitive
public static void loadLibrary(java.lang.String arg0) {
}
public static native java.lang.String mapLibraryName(java.lang.String arg0) {
}
public static java.lang.String lineSeparator() {
}
public static void setIn(java.io.InputStream arg0) {
}
public static void setOut(java.io.PrintStream arg0) {
}
public static void setErr(java.io.PrintStream arg0) {
}
public static java.io.Console console() {
}
public static java.nio.channels.Channel inheritedChannel() throws java.io.IOException {
}
private static void checkIO() {
}
private static native void setIn0(java.io.InputStream arg0) {
}
private static native void setOut0(java.io.PrintStream arg0) {
}
private static native void setErr0(java.io.PrintStream arg0) {
}
public static void setSecurityManager(java.lang.SecurityManager arg0) {
}
private static synchronized void setSecurityManager0(java.lang.SecurityManager arg0) {
}
private static native java.util.Properties initProperties(java.util.Properties arg0) {
}
public static java.util.Properties getProperties() {
}
public static void setProperties(java.util.Properties arg0) {
}
public static java.lang.String setProperty(java.lang.String arg0, java.lang.String arg1) {
}
public static java.lang.String clearProperty(java.lang.String arg0) {
}
private static void checkKey(java.lang.String arg0) {
}
public static java.lang.String getenv(java.lang.String arg0) {
}
public static java.util.Map<java.lang.String, java.lang.String> getenv() {
}
@jdk.internal.reflect.CallerSensitive
public static java.lang.System.Logger getLogger(java.lang.String arg0, java.util.ResourceBundle arg1) {
}
@jdk.internal.reflect.CallerSensitive
public static java.lang.System.Logger getLogger(java.lang.String arg0) {
}
public static void gc() {
}
@jdk.internal.reflect.CallerSensitive
public static void load(java.lang.String arg0) {
}
private static java.io.PrintStream newPrintStream(java.io.FileOutputStream arg0, java.lang.String arg1) {
}
private static void logInitException(boolean arg0, boolean arg1, java.lang.String arg2, java.lang.Throwable arg3) {
}
private static void setJavaLangAccess() {
}
public static final java.io.InputStream in;
public static final java.io.PrintStream out;
public static final java.io.PrintStream err;
private static volatile java.io.Console cons;
private static java.util.Properties props;
private static java.lang.String lineSeparator;
static java.lang.ModuleLayer bootLayer;
public static abstract class LoggerFinder {
protected LoggerFinder() {
}
private LoggerFinder(java.lang.Void arg0) {
}
private static java.lang.Void checkPermission() {
}
public abstract java.lang.System.Logger getLogger(java.lang.String arg0, java.lang.Module arg1);
static java.lang.System.LoggerFinder accessProvider() {
}
public java.lang.System.Logger getLocalizedLogger(java.lang.String arg0, java.util.ResourceBundle arg1, java.lang.Module arg2) {
}
public static java.lang.System.LoggerFinder getLoggerFinder() {
}
static final java.lang.RuntimePermission LOGGERFINDER_PERMISSION;
private static volatile java.lang.System.LoggerFinder service;
}
public static abstract interface Logger {
public abstract java.lang.String getName();
public default void log(java.lang.System.Logger.Level arg0, java.lang.String arg1, java.lang.Object... arg2) {
}
public default void log(java.lang.System.Logger.Level arg0, java.util.function.Supplier<java.lang.String> arg1, java.lang.Throwable arg2) {
}
public default void log(java.lang.System.Logger.Level arg0, java.lang.String arg1, java.lang.Throwable arg2) {
}
public abstract void log(java.lang.System.Logger.Level arg0, java.util.ResourceBundle arg1, java.lang.String arg2, java.lang.Throwable arg3);
public abstract void log(java.lang.System.Logger.Level arg0, java.util.ResourceBundle arg1, java.lang.String arg2, java.lang.Object... arg3);
public default void log(java.lang.System.Logger.Level arg0, java.lang.String arg1) {
}
public default void log(java.lang.System.Logger.Level arg0, java.util.function.Supplier<java.lang.String> arg1) {
}
public default void log(java.lang.System.Logger.Level arg0, java.lang.Object arg1) {
}
public abstract boolean isLoggable(java.lang.System.Logger.Level arg0);
public static final enum Level {
ALL,
TRACE,
DEBUG,
INFO,
WARNING,
ERROR,
OFF;
private Level(int arg0) {
}
public final java.lang.String getName() {
}
public final int getSeverity() {
}
private final int severity;
}
}
}]
Spoon Version
10.2.0-beta-21
JVM Version
11
What operating system are you using?
Windows 11