From 69b403783bd5a9b70f8bc13ec2ecc41012b1c589 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 17 Aug 2012 20:54:11 +0400 Subject: [PATCH] multifile debugger tests --- .../jet/codegen/GenerationUtils.java | 24 +++++- .../plugin/debugger/JetPositionManager.java | 13 +++ .../testData/debugger/multiFileNamespace/a.kt | 5 ++ .../testData/debugger/multiFileNamespace/b.kt | 5 ++ .../debugger/JetPositionManagerTest.java | 30 ++++++- .../debugger/PositionManagerTestCase.java | 83 +++++++++++++------ 6 files changed, 128 insertions(+), 32 deletions(-) create mode 100644 idea/testData/debugger/multiFileNamespace/a.kt create mode 100644 idea/testData/debugger/multiFileNamespace/b.kt diff --git a/compiler/tests/org/jetbrains/jet/codegen/GenerationUtils.java b/compiler/tests/org/jetbrains/jet/codegen/GenerationUtils.java index 4e76fbc812a..8fa025db0e4 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/GenerationUtils.java +++ b/compiler/tests/org/jetbrains/jet/codegen/GenerationUtils.java @@ -16,6 +16,9 @@ package org.jetbrains.jet.codegen; +import com.google.common.base.Predicates; +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.analyzer.AnalyzeExhaust; import org.jetbrains.jet.lang.BuiltinsScopeExtensionMode; @@ -24,6 +27,7 @@ import org.jetbrains.jet.lang.resolve.AnalyzerScriptParameter; import org.jetbrains.jet.lang.resolve.java.AnalyzerFacadeForJVM; import java.util.Collections; +import java.util.List; /** * @author Stepan Koltsov @@ -33,17 +37,31 @@ public class GenerationUtils { private GenerationUtils() { } + @NotNull public static ClassFileFactory compileFileGetClassFileFactoryForTest(@NotNull JetFile psiFile) { return compileFileGetGenerationStateForTest(psiFile).getFactory(); } - public static GenerationState compileFileGetGenerationStateForTest(JetFile psiFile) { + @NotNull + public static GenerationState compileFileGetGenerationStateForTest(@NotNull JetFile psiFile) { final AnalyzeExhaust analyzeExhaust = AnalyzerFacadeForJVM.analyzeOneFileWithJavaIntegrationAndCheckForErrors( psiFile, Collections.emptyList(), BuiltinsScopeExtensionMode.ALL); + return compileFilesGetGenerationState(analyzeExhaust, Collections.singletonList(psiFile)); + } + + @NotNull + public static GenerationState compileManyFilesGetGenerationStateForTest(@NotNull Project project, @NotNull List files) { + final AnalyzeExhaust analyzeExhaust = AnalyzerFacadeForJVM.analyzeFilesWithJavaIntegrationAndCheckForErrors( + project, files, Collections.emptyList(), Predicates.alwaysTrue(), BuiltinsScopeExtensionMode.ALL); + return compileFilesGetGenerationState(analyzeExhaust, files); + } + + + @NotNull + private static GenerationState compileFilesGetGenerationState(@NotNull AnalyzeExhaust analyzeExhaust, @NotNull List files) { analyzeExhaust.throwIfError(); - GenerationState state = new GenerationState(ClassBuilderFactories.binaries(false), analyzeExhaust, Collections.singletonList(psiFile)); + GenerationState state = new GenerationState(ClassBuilderFactories.binaries(false), analyzeExhaust, files); state.compileCorrectFiles(CompilationErrorHandler.THROW_EXCEPTION); return state; } - } diff --git a/idea/src/org/jetbrains/jet/plugin/debugger/JetPositionManager.java b/idea/src/org/jetbrains/jet/plugin/debugger/JetPositionManager.java index 448739910b2..f949a84c18a 100644 --- a/idea/src/org/jetbrains/jet/plugin/debugger/JetPositionManager.java +++ b/idea/src/org/jetbrains/jet/plugin/debugger/JetPositionManager.java @@ -35,6 +35,7 @@ import com.sun.jdi.ReferenceType; import com.sun.jdi.request.ClassPrepareRequest; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.TestOnly; import org.jetbrains.jet.analyzer.AnalyzeExhaust; import org.jetbrains.jet.codegen.JetTypeMapper; import org.jetbrains.jet.codegen.MapTypeMode; @@ -241,4 +242,16 @@ public class JetPositionManager implements PositionManager { } return myDebugProcess.getRequestsManager().createClassPrepareRequest(classPrepareRequestor, className.replace('/', '.')); } + + @TestOnly + public void addTypeMapper(JetFile file, final JetTypeMapper typeMapper) { + FqName fqName = JetPsiUtil.getFQName(file); + CachedValue value = CachedValuesManager.getManager(file.getProject()).createCachedValue(new CachedValueProvider() { + @Override + public Result compute() { + return new Result(typeMapper, PsiModificationTracker.MODIFICATION_COUNT); + } + }, false); + myTypeMappers.put(fqName, value); + } } diff --git a/idea/testData/debugger/multiFileNamespace/a.kt b/idea/testData/debugger/multiFileNamespace/a.kt new file mode 100644 index 00000000000..d6cd489f594 --- /dev/null +++ b/idea/testData/debugger/multiFileNamespace/a.kt @@ -0,0 +1,5 @@ +package test + +fun foo() { + "" // test/namespace$src$a +} diff --git a/idea/testData/debugger/multiFileNamespace/b.kt b/idea/testData/debugger/multiFileNamespace/b.kt new file mode 100644 index 00000000000..5b979dbef98 --- /dev/null +++ b/idea/testData/debugger/multiFileNamespace/b.kt @@ -0,0 +1,5 @@ +package test + +fun bar() { + foo(); // test/namespace$src$b +} diff --git a/idea/tests/org/jetbrains/jet/plugin/debugger/JetPositionManagerTest.java b/idea/tests/org/jetbrains/jet/plugin/debugger/JetPositionManagerTest.java index 6f00b72152c..78d4722d7a8 100644 --- a/idea/tests/org/jetbrains/jet/plugin/debugger/JetPositionManagerTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/debugger/JetPositionManagerTest.java @@ -16,21 +16,45 @@ package org.jetbrains.jet.plugin.debugger; -import com.intellij.debugger.PositionManagerFactory; +import com.intellij.debugger.engine.DebugProcess; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.codegen.GenerationState; +import org.jetbrains.jet.codegen.JetTypeMapper; +import org.jetbrains.jet.di.InjectorForJetTypeMapper; +import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.plugin.PluginTestCaseBase; +import java.util.List; + /** * @author udalov */ public class JetPositionManagerTest extends PositionManagerTestCase { + private final JetPositionManagerFactory jetPositionManagerFactory = new JetPositionManagerFactory(); + @Override + @NotNull protected String getTestDataPath() { return PluginTestCaseBase.getTestDataPathBase() + "/debugger"; } @Override - protected PositionManagerFactory getPositionManagerFactory() { - return new JetPositionManagerFactory(); + @NotNull + protected JetPositionManager createPositionManager(DebugProcess process, List files, GenerationState state) { + JetPositionManager positionManager = (JetPositionManager) jetPositionManagerFactory.createPositionManager(process); + assertNotNull(positionManager); + + JetTypeMapper typeMapper = new InjectorForJetTypeMapper(state.getBindingContext(), files).getJetTypeMapper(); + typeMapper.getClosureAnnotator().init(); + for (JetFile file : files) { + positionManager.addTypeMapper(file, typeMapper); + } + + return positionManager; + } + + public void testMultiFileNamespace() { + doMultiTest("multiFileNamespace/a.kt", "multiFileNamespace/b.kt"); } public void testAnnotation() { diff --git a/idea/tests/org/jetbrains/jet/plugin/debugger/PositionManagerTestCase.java b/idea/tests/org/jetbrains/jet/plugin/debugger/PositionManagerTestCase.java index bcac12b0363..19efe24fabd 100644 --- a/idea/tests/org/jetbrains/jet/plugin/debugger/PositionManagerTestCase.java +++ b/idea/tests/org/jetbrains/jet/plugin/debugger/PositionManagerTestCase.java @@ -16,10 +16,10 @@ package org.jetbrains.jet.plugin.debugger; +import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.intellij.debugger.NoDataException; import com.intellij.debugger.PositionManager; -import com.intellij.debugger.PositionManagerFactory; import com.intellij.debugger.SourcePosition; import com.intellij.debugger.engine.DebugProcess; import com.intellij.debugger.engine.DebugProcessEvents; @@ -27,11 +27,12 @@ import com.intellij.debugger.jdi.VirtualMachineProxyImpl; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.psi.PsiFile; import com.intellij.testFramework.PlatformTestCase; import com.sun.jdi.*; +import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.JetTestUtils; import org.jetbrains.jet.codegen.ClassFileFactory; +import org.jetbrains.jet.codegen.GenerationState; import org.jetbrains.jet.codegen.GenerationUtils; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.utils.ExceptionUtils; @@ -52,9 +53,11 @@ public abstract class PositionManagerTestCase extends PlatformTestCase { // This pattern matches against these line comments and saves the class name in the first group private static final Pattern breakpointPattern = Pattern.compile("^.*//\\s*([a-zA-Z0-9._/$]*)\\s*$"); + @NotNull protected abstract String getTestDataPath(); - protected abstract PositionManagerFactory getPositionManagerFactory(); + @NotNull + protected abstract PositionManager createPositionManager(DebugProcess process, List files, GenerationState state); @Override protected final void setUp() throws Exception { @@ -92,31 +95,49 @@ public abstract class PositionManagerTestCase extends PlatformTestCase { } protected void doTest() { - File file = new File(getTestDataPath(), getTestName(true) + ".kt"); - String fileContent; - try { - fileContent = FileUtil.loadFile(file); - } - catch (IOException e) { - throw ExceptionUtils.rethrow(e); - } - final PsiFile psiFile = JetTestUtils.createFile(file.getAbsolutePath(), fileContent, getProject()); + doTest(getTestDataPath() + "/" + getTestName(true) + ".kt"); + } - final Map breakpoints = extractBreakpointsInfo(fileContent); + protected void doMultiTest(String... filenames) { + for (int i = 0; i < filenames.length; i++) { + filenames[i] = getTestDataPath() + "/" + filenames[i]; + } + doTest(filenames); + } - Map referencesByName = compileFileGetReferenceMap((JetFile) psiFile); + private void doTest(String... filenames) { + final List files = Lists.newArrayList(); + final List breakpoints = Lists.newArrayList(); + + for (String filename : filenames) { + File file = new File(filename); + String fileContent; + try { + fileContent = FileUtil.loadFile(file); + } + catch (IOException e) { + throw ExceptionUtils.rethrow(e); + } + final JetFile jetFile = (JetFile)JetTestUtils.createFile(file.getAbsolutePath(), fileContent, getProject()); + + files.add(jetFile); + breakpoints.addAll(extractBreakpointsInfo(jetFile, fileContent)); + } + + GenerationState state = GenerationUtils.compileManyFilesGetGenerationStateForTest(getProject(), files); + + Map referencesByName = getReferenceMap(state.getFactory()); final DebugProcess debugProcess = createDebugProcess(referencesByName); + final PositionManager positionManager = createPositionManager(debugProcess, files, state); + ApplicationManager.getApplication().runReadAction(new Runnable() { public void run() { try { - PositionManager positionManager = getPositionManagerFactory().createPositionManager(debugProcess); - assertNotNull(positionManager); - for (Integer lineNumber : breakpoints.keySet()) { - String className = breakpoints.get(lineNumber); - SourcePosition position = SourcePosition.createFromLine(psiFile, lineNumber); - assertPositionIsValid(position, className, positionManager); + for (Breakpoint breakpoint : breakpoints) { + SourcePosition position = SourcePosition.createFromLine(breakpoint.file, breakpoint.lineNumber); + assertPositionIsValid(position, breakpoint.className, positionManager); } } catch (NoDataException e) { @@ -126,24 +147,22 @@ public abstract class PositionManagerTestCase extends PlatformTestCase { }); } - private static Map extractBreakpointsInfo(String fileContent) { - Map breakpoints = Maps.newHashMap(); + private static Collection extractBreakpointsInfo(JetFile file, String fileContent) { + Collection breakpoints = Lists.newArrayList(); String[] lines = StringUtil.convertLineSeparators(fileContent).split("\n"); for (int i = 0; i < lines.length; i++) { Matcher matcher = breakpointPattern.matcher(lines[i]); if (matcher.matches()) { // Line breakpoint numbers are 1-based - breakpoints.put(i + 1, matcher.group(1)); + breakpoints.add(new Breakpoint(file, i + 1, matcher.group(1))); } } return breakpoints; } - private static Map compileFileGetReferenceMap(JetFile jetFile) { - ClassFileFactory classFileFactory = GenerationUtils.compileFileGetClassFileFactoryForTest(jetFile); - + private static Map getReferenceMap(ClassFileFactory classFileFactory) { Map referencesByName = Maps.newHashMap(); for (String classFileName : classFileFactory.files()) { String name = classFileName.substring(0, classFileName.lastIndexOf('.')); @@ -176,6 +195,18 @@ public abstract class PositionManagerTestCase extends PlatformTestCase { assertEquals(className, type.name()); } + private static class Breakpoint { + private final JetFile file; + private final int lineNumber; + private final String className; + + private Breakpoint(JetFile file, int lineNumber, String className) { + this.file = file; + this.lineNumber = lineNumber; + this.className = className; + } + } + private static class MockVirtualMachineProxy extends VirtualMachineProxyImpl { private final Map referencesByName;