Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,7 @@
package org.openrewrite.kotlin;

import kotlin.Pair;
import kotlin.Unit;
import kotlin.annotation.AnnotationTarget;
import kotlin.jvm.functions.Function1;
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
import org.intellij.lang.annotations.Language;
Expand All @@ -33,15 +31,10 @@
import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles;
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment;
import org.jetbrains.kotlin.cli.jvm.compiler.VfsBasedProjectEnvironment;
import org.jetbrains.kotlin.cli.jvm.config.JvmContentRootsKt;
import org.jetbrains.kotlin.cli.pipeline.jvm.JvmFir2IrPipelineArtifact;
import org.jetbrains.kotlin.cli.pipeline.jvm.JvmFir2IrPipelinePhase;
import org.jetbrains.kotlin.cli.pipeline.jvm.JvmFrontendPipelineArtifact;
import org.jetbrains.kotlin.cli.pipeline.jvm.JvmFrontendPipelinePhase;
import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar;
import org.jetbrains.kotlin.diagnostics.impl.BaseDiagnosticsCollector;
import org.jetbrains.kotlin.diagnostics.impl.SimpleDiagnosticsCollector;
import org.openrewrite.kotlin.internal.ScriptCompilerPlugin;
import org.jetbrains.kotlin.com.intellij.openapi.Disposable;
import org.jetbrains.kotlin.com.intellij.openapi.util.Disposer;
import org.jetbrains.kotlin.com.intellij.openapi.util.text.StringUtilRt;
Expand All @@ -53,7 +46,10 @@
import org.jetbrains.kotlin.com.intellij.psi.PsiManager;
import org.jetbrains.kotlin.com.intellij.psi.SingleRootFileViewProvider;
import org.jetbrains.kotlin.com.intellij.testFramework.LightVirtualFile;
import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar;
import org.jetbrains.kotlin.config.*;
import org.jetbrains.kotlin.diagnostics.impl.BaseDiagnosticsCollector;
import org.jetbrains.kotlin.diagnostics.impl.SimpleDiagnosticsCollector;
import org.jetbrains.kotlin.fir.DependencyListForCliModule;
import org.jetbrains.kotlin.fir.FirSession;
import org.jetbrains.kotlin.fir.declarations.FirFile;
Expand All @@ -63,10 +59,10 @@
import org.jetbrains.kotlin.fir.pipeline.ModuleCompilerAnalyzedOutput;
import org.jetbrains.kotlin.fir.resolve.ScopeSession;
import org.jetbrains.kotlin.fir.session.environment.AbstractProjectFileSearchScope;
import org.jetbrains.kotlin.ir.declarations.IrFile;
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment;
import org.jetbrains.kotlin.idea.KotlinFileType;
import org.jetbrains.kotlin.idea.KotlinLanguage;
import org.jetbrains.kotlin.ir.declarations.IrFile;
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment;
import org.jetbrains.kotlin.modules.Module;
import org.jetbrains.kotlin.name.Name;
import org.jetbrains.kotlin.psi.KtFile;
Expand All @@ -77,10 +73,7 @@
import org.openrewrite.java.JavaParser;
import org.openrewrite.java.internal.JavaTypeCache;
import org.openrewrite.java.marker.JavaSourceSet;
import org.openrewrite.kotlin.internal.CompiledSource;
import org.openrewrite.kotlin.internal.KotlinSource;
import org.openrewrite.kotlin.internal.KotlinTreeParserVisitor;
import org.openrewrite.kotlin.internal.PsiElementAssociations;
import org.openrewrite.kotlin.internal.*;
import org.openrewrite.kotlin.tree.K;
import org.openrewrite.style.NamedStyles;
import org.openrewrite.tree.ParseError;
Expand All @@ -100,6 +93,7 @@

import static java.util.Collections.*;
import static java.util.stream.Collectors.toList;
import static java.util.stream.Collectors.toSet;
import static org.jetbrains.kotlin.cli.common.messages.MessageRenderer.PLAIN_FULL_PATHS;
import static org.jetbrains.kotlin.cli.jvm.JvmArgumentsKt.*;
import static org.jetbrains.kotlin.cli.jvm.K2JVMCompilerKt.configureModuleChunk;
Expand Down Expand Up @@ -171,6 +165,9 @@ public Stream<SourceFile> parseInputs(Iterable<Input> sources, @Nullable Path re
ParsingExecutionContextView pctx = ParsingExecutionContextView.view(ctx);
ParsingEventListener parsingListener = pctx.getParsingListener();

Set<Path> dependsOnPaths = dependsOn == null ? emptySet() :
dependsOn.stream().map(Input::getPath).collect(toSet());

// TODO: FIR and disposable may not be necessary using the IR.
Disposable disposable = Disposer.newDisposable();
CompiledSource compilerCus;
Expand Down Expand Up @@ -216,7 +213,7 @@ public Stream<SourceFile> parseInputs(Iterable<Input> sources, @Nullable Path re
})
.limit(1))
.filter(Objects::nonNull)
.filter(source -> !source.getSourcePath().getFileName().toString().startsWith("dependsOn-"));
.filter(source -> !dependsOnPaths.contains(source.getSourcePath()));
}

@Override
Expand Down Expand Up @@ -352,7 +349,7 @@ public Builder addClasspathEntry(Path entry) {

public Builder dependsOn(@Language("kotlin") String... inputsAsStrings) {
this.dependsOn = Arrays.stream(inputsAsStrings)
.map(input -> Input.fromString(determinePath("dependsOn-", input), input))
.map(input -> Input.fromString(determinePath(input), input))
.collect(toList());
return this;
}
Expand Down Expand Up @@ -681,7 +678,7 @@ private List<Integer> getCRLFLocations(String source) {

static class SourcePathFromSourceTextResolver {
private static final Pattern packagePattern = Pattern.compile("^package\\s+(\\S+)");
private static final Pattern classPattern = Pattern.compile("(class|interface|enum class)\\s*(<[^>]*>)?\\s+(\\w+)");
private static final Pattern classPattern = Pattern.compile("(class|interface|data class|enum class)\\s*(<[^>]*>)?\\s+(\\w+)");
private static final Pattern publicClassPattern = Pattern.compile("public\\s+" + classPattern.pattern());

private static Optional<String> matchClassPattern(Pattern pattern, String source) {
Expand All @@ -692,13 +689,13 @@ private static Optional<String> matchClassPattern(Pattern pattern, String source
return Optional.empty();
}

static Path determinePath(String prefix, String sourceCode) {
static Path determinePath(String sourceCode) {
String className = matchClassPattern(publicClassPattern, sourceCode)
.orElseGet(() -> matchClassPattern(classPattern, sourceCode)
.orElse(Long.toString(System.nanoTime())));
Matcher packageMatcher = packagePattern.matcher(sourceCode);
String pkg = packageMatcher.find() ? packageMatcher.group(1).replace('.', '/') + "/" : "";
return Paths.get(pkg, prefix + className + ".kt");
return Paths.get(pkg, className + ".kt");
}
}
}