Skip to content

[Bug]: Unable to parse CtElement from a JDK-runtime-element by CtPath #4984

Open
@kaml8

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

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions