diff --git a/compiler/cli/src/org/jetbrains/jet/cli/KDocProcessor.java b/compiler/cli/src/org/jetbrains/jet/cli/KDocProcessor.java index ff6b81b56f0..d2a03964799 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/KDocProcessor.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/KDocProcessor.java @@ -17,12 +17,34 @@ */ package org.jetbrains.jet.cli; +import com.google.common.base.Predicates; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import com.intellij.lang.ASTNode; +import com.intellij.openapi.Disposable; +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.compiler.JetCoreEnvironment; import org.jetbrains.jet.compiler.JetFileProcessor; -import org.jetbrains.jet.lang.psi.JetDeclaration; +import org.jetbrains.jet.lang.Configuration; +import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory; +import org.jetbrains.jet.lang.descriptors.ClassDescriptor; +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; +import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; import org.jetbrains.jet.lang.psi.JetFile; -import org.jetbrains.jet.lang.resolve.java.AnalyzerFacade; +import org.jetbrains.jet.lang.psi.JetPsiFactory; +import org.jetbrains.jet.lang.resolve.AnalyzingUtils; +import org.jetbrains.jet.lang.resolve.BindingContext; +import org.jetbrains.jet.lang.resolve.BindingTraceContext; +import org.jetbrains.jet.lang.resolve.java.JavaBridgeConfiguration; +import org.jetbrains.jet.lexer.JetTokens; +import org.jetbrains.jet.resolve.DescriptorRenderer; +import java.util.Collection; import java.util.List; +import java.util.Set; /** */ @@ -36,6 +58,73 @@ public class KDocProcessor implements JetFileProcessor { @Override public void processFiles(List sources) { + // JetFile's are PSI (Program Source Interface) classes, i.e. they contain the concrete syntax trees of files + if (sources.isEmpty()) return; + + // Let's perform the semantic analysis + Project project = sources.get(0).getProject(); + Configuration javaBridgeConfiguration = JavaBridgeConfiguration.createJavaBridgeConfiguration(project, new BindingTraceContext(), Configuration.EMPTY); + + // The BindingContext holds a mapping between the semantic data (DesclarationDescriptor's) and PSI + BindingContext context = AnalyzingUtils.analyzeFiles(project, javaBridgeConfiguration, sources, Predicates.alwaysFalse(), JetControlFlowDataTraceFactory.EMPTY); + + // Now we need all the packages. They are listed in the files + Set allNamespaces = Sets.newHashSet(); + for (JetFile source : sources) { + // We retrieve a descriptor by a PSI element from the context + NamespaceDescriptor namespaceDescriptor = context.get(BindingContext.NAMESPACE, source); + allNamespaces.add(namespaceDescriptor); + } + + for (NamespaceDescriptor namespace : allNamespaces) { + // Let's take all the declarations in the namespace... + processDescriptors(namespace.getMemberScope().getAllDescriptors(), context); + } + // TODO fire up the KDoc processor here... } + + private void processDescriptors(Collection allDescriptors, BindingContext context) { + for (DeclarationDescriptor descriptor : allDescriptors) { + PsiElement classElement = context.get(BindingContext.DESCRIPTOR_TO_DECLARATION, descriptor); + // Print the doc comment text + String docComment = getDocCommentFor(classElement); + if (docComment != null) { + System.out.println("Docs for " + descriptor.getName() + ": " + docComment); + } + else { + System.out.println("No docs for " + descriptor.getName()); + } + // Print the class header (verbose) + System.out.println(DescriptorRenderer.TEXT.render(descriptor)); + // Process members, if any + if (descriptor instanceof ClassDescriptor) { + ClassDescriptor classDescriptor = (ClassDescriptor) descriptor; + processDescriptors(classDescriptor.getDefaultType().getMemberScope().getAllDescriptors(), context); + } + } + } + + @Nullable + private String getDocCommentFor(PsiElement psiElement) { + // This method is a hack. Doc comments should be easilty accessible, but they aren't for now. + ASTNode node = psiElement.getNode().getTreePrev(); + while (node != null && (node.getElementType() == JetTokens.WHITE_SPACE || node.getElementType() == JetTokens.BLOCK_COMMENT)) { + node = node.getTreePrev(); + } + if (node == null) return null; + if (node.getElementType() != JetTokens.DOC_COMMENT) return null; + return node.getText(); + } + + public static void main(String[] args) { + JetCoreEnvironment jetCoreEnvironment = new JetCoreEnvironment(new Disposable() { + @Override + public void dispose() { + } + }); + List files = Lists.newArrayList(); + files.add(JetPsiFactory.createFile(jetCoreEnvironment.getProject(), "package a;/**sdfsdf*/class A {fun foo() {} /**doc*/ fun bar() {}}")); + new KDocProcessor("").processFiles(files); + } }