diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/AbstractLazyMemberScope.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/AbstractLazyMemberScope.java index 6cda23778e9..82cb84c932c 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/AbstractLazyMemberScope.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/AbstractLazyMemberScope.java @@ -150,6 +150,10 @@ public abstract class AbstractLazyMemberScope files = Lists.newArrayList(psiFile); + + ModuleDescriptor lazyModule = new ModuleDescriptor(Name.special("")); + final ResolveSession resolveSession = new ResolveSession(project, lazyModule, injectorForTopDownAnalyzer.getJavaBridgeConfiguration(), + new FileBasedDeclarationProviderFactory(files)); + + final List descriptors = new ArrayList(); + psiFile.accept(new JetVisitorVoid() { + @Override + public void visitJetFile(JetFile file) { + String qualifiedName = file.getNamespaceHeader().getQualifiedName(); + if (!qualifiedName.isEmpty()) { + NamespaceDescriptor packageDescriptor = resolveSession.getPackageDescriptorByFqName(new FqName(qualifiedName)); + descriptors.add(packageDescriptor); + } + file.acceptChildren(this); + } + + @Override + public void visitClassObject(JetClassObject classObject) { + classObject.acceptChildren(this); + } + + @Override + public void visitParameter(JetParameter parameter) { + PsiElement declaringElement = parameter.getParent().getParent(); + if (declaringElement instanceof JetFunctionType) { + return; + } + if (declaringElement instanceof JetNamedFunction) { + JetNamedFunction jetNamedFunction = (JetNamedFunction) declaringElement; + FunctionDescriptor functionDescriptor = (FunctionDescriptor) resolveSession.resolveToDescriptor(jetNamedFunction); + for (ValueParameterDescriptor valueParameterDescriptor : functionDescriptor.getValueParameters()) { + if (valueParameterDescriptor.getName().equals(parameter.getNameAsName())) { + descriptors.add(valueParameterDescriptor); + } + } + } + else { + super.visitParameter(parameter); + } + } + + @Override + public void visitPropertyAccessor(JetPropertyAccessor accessor) { + JetProperty parent = (JetProperty) accessor.getParent(); + PropertyDescriptor propertyDescriptor = (PropertyDescriptor) resolveSession.resolveToDescriptor(parent); + if (accessor.isGetter()) { + descriptors.add(propertyDescriptor.getGetter()); + } + else { + descriptors.add(propertyDescriptor.getSetter()); + } + } + + @Override + public void visitDeclaration(JetDeclaration element) { + DeclarationDescriptor descriptor = resolveSession.resolveToDescriptor(element); + descriptors.add(descriptor); + element.acceptChildren(this); + } + + @Override + public void visitJetElement(JetElement element) { + element.acceptChildren(this); + } + }); + + StringBuilder renderedDescriptors = new StringBuilder(); + for (DeclarationDescriptor descriptor : descriptors) { + if (renderedDescriptors.length() != 0) { + renderedDescriptors.append("\n"); + } + renderedDescriptors.append(DescriptorRenderer.TEXT.render(descriptor)); + } + + Document document = new DocumentImpl(psiFile.getText()); + assertEquals(JetTestUtils.getLastCommentedLines(document), renderedDescriptors.toString()); + } +} diff --git a/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveDescriptorRendererTestGenerated.java b/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveDescriptorRendererTestGenerated.java new file mode 100644 index 00000000000..ef31029938b --- /dev/null +++ b/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveDescriptorRendererTestGenerated.java @@ -0,0 +1,133 @@ +/* + * Copyright 2010-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.jet.lang.resolve.lazy; + +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +import java.io.File; +import java.lang.reflect.Method; +import java.util.HashSet; +import java.util.Set; + +/* This class is generated by LazyResolveTestGenerator. DO NOT MODIFY MANUALLY */ +@RunWith(Suite.class) +@Suite.SuiteClasses({ + LazyResolveDescriptorRendererTestGenerated.Renderer.class, + LazyResolveDescriptorRendererTestGenerated.DescriptorRenderer.class +}) +public class LazyResolveDescriptorRendererTestGenerated { + public static class Renderer extends AbstractLazyResolveDescriptorRendererTest { + @Test + public void allTestsPresentInRenderer() throws Exception { + allTestsPresent(Renderer.class, new File("compiler/testData/renderer"), true); + } + + @Test + public void testClasses() throws Exception { + doTest("compiler/testData/renderer/Classes.kt"); + } + + @Test + public void testEnum() throws Exception { + doTest("compiler/testData/renderer/Enum.kt"); + } + + @Test + public void testErrorType() throws Exception { + doTest("compiler/testData/renderer/ErrorType.kt"); + } + + @Test + public void testFunctionTypes() throws Exception { + doTest("compiler/testData/renderer/FunctionTypes.kt"); + } + + @Test + public void testGlobalFunctions() throws Exception { + doTest("compiler/testData/renderer/GlobalFunctions.kt"); + } + + @Test + public void testGlobalProperties() throws Exception { + doTest("compiler/testData/renderer/GlobalProperties.kt"); + } + + @Test + public void testTupleTypes() throws Exception { + doTest("compiler/testData/renderer/TupleTypes.kt"); + } + + public static void allTestsPresent(Class clazz, File testDataDir, boolean recursive) { + Set methodNames = new HashSet(); + for (Method method : clazz.getDeclaredMethods()) { + if (method.isAnnotationPresent(Test.class)) { + methodNames.add(method.getName().toLowerCase() + ".kt"); + } + } + for (File file : testDataDir.listFiles()) { + if (file.isDirectory()) { + if (recursive) { + allTestsPresent(clazz, file, recursive); + } + } + else { + String name = file.getName(); + if (name.endsWith(".kt") && !methodNames.contains("test" + name.toLowerCase())) { + Assert.fail("Test data file missing from the generated test class: " + file + "\nPlease re-run the generator: LazyResolveTestGenerator"); + } + } + } + } + } + + public static class DescriptorRenderer extends AbstractLazyResolveDescriptorRendererTest { + @Test + public void allTestsPresentInDescriptorRenderer() throws Exception { + allTestsPresent(DescriptorRenderer.class, new File("compiler/testData/lazyResolve/descriptorRenderer"), true); + } + + @Test + public void testClassObject() throws Exception { + doTest("compiler/testData/lazyResolve/descriptorRenderer/ClassObject.kt"); + } + + public static void allTestsPresent(Class clazz, File testDataDir, boolean recursive) { + Set methodNames = new HashSet(); + for (Method method : clazz.getDeclaredMethods()) { + if (method.isAnnotationPresent(Test.class)) { + methodNames.add(method.getName().toLowerCase() + ".kt"); + } + } + for (File file : testDataDir.listFiles()) { + if (file.isDirectory()) { + if (recursive) { + allTestsPresent(clazz, file, recursive); + } + } + else { + String name = file.getName(); + if (name.endsWith(".kt") && !methodNames.contains("test" + name.toLowerCase())) { + Assert.fail("Test data file missing from the generated test class: " + file + "\nPlease re-run the generator: LazyResolveTestGenerator"); + } + } + } + } + } + +}