openrewrite / rewrite-kotlin

Work-in-progress implementation of Kotlin language support for OpenRewrite.
Apache License 2.0
38 stars 11 forks source link

Potential endless loop in `MaybeUsesImport` visitor #601

Open knutwannheden opened 1 month ago

knutwannheden commented 1 month ago

This bug has been observed, but so far we haven't had any time to reproduce it yet. It appears that the MaybeUsesImport visitor can get caught in an endless loop on some Kotlin sources. The loop in question is this one: https://github.com/openrewrite/rewrite/blob/19c73502d29abe475cb4360f293fbe2e7b3d0027/rewrite-java/src/main/java/org/openrewrite/java/search/MaybeUsesImport.java#L57-L76

            for (Expression expr = i.getQualid(); expr != prior; ) {
                if (expr instanceof J.Identifier) {
                    // this can only be the first segment
                    prior = expr;
                    if (!((J.Identifier) expr).getSimpleName().equals(segment)) {
                        return false;
                    }
                } else if (expr instanceof J.FieldAccess) {
                    J.FieldAccess fa = (J.FieldAccess) expr;
                    if (fa.getTarget() == prior) {
                        String simpleName = fa.getSimpleName();
                        if (!"*".equals(segment) && !simpleName.equals(segment) && !"*".equals(simpleName)) {
                            return false;
                        }
                        prior = fa;
                        continue;
                    }
                    expr = fa.getTarget();
                }
            }