Roaster parser and javadoc support

This commit is contained in:
BoykoAlex
2016-11-17 17:14:51 -05:00
parent f2abf2d21d
commit 2c9a250ec5
9 changed files with 390 additions and 55 deletions

View File

@@ -12,6 +12,12 @@
<relativePath>../pom.xml</relativePath>
</parent>
<properties>
<!-- roatser version -->
<roaster.version>2.19.2.Final</roaster.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.ide.vscode</groupId>
@@ -28,5 +34,16 @@
<artifactId>javaparser-core</artifactId>
<version>2.5.1</version>
</dependency>
<dependency>
<groupId>org.jboss.forge.roaster</groupId>
<artifactId>roaster-api</artifactId>
<version>${roaster.version}</version>
</dependency>
<dependency>
<groupId>org.jboss.forge.roaster</groupId>
<artifactId>roaster-jdt</artifactId>
<version>${roaster.version}</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</project>

View File

@@ -10,5 +10,5 @@ public interface IJavadocProvider {
IJavadoc getJavadoc(IMethod method);
IJavadoc getJavadoc(IAnnotation method);
IJavadoc getJavadoc(IAnnotation annotation);
}

View File

@@ -21,11 +21,11 @@ import com.github.javaparser.ast.body.MethodDeclaration;
import com.github.javaparser.ast.body.VariableDeclarator;
import com.github.javaparser.ast.visitor.GenericVisitorAdapter;
public class JavadocProvider implements IJavadocProvider {
public class ParserJavadocProvider implements IJavadocProvider {
private SourceUrlProvider sourceUrlProvider;
public JavadocProvider(SourceUrlProvider sourceUrlProvider) {
public ParserJavadocProvider(SourceUrlProvider sourceUrlProvider) {
this.sourceUrlProvider = sourceUrlProvider;
}

View File

@@ -0,0 +1,41 @@
package org.springframework.ide.vscode.commons.java.roaster;
import java.io.InputStream;
import java.net.URL;
import java.util.concurrent.ExecutionException;
import org.jboss.forge.roaster.Roaster;
import org.jboss.forge.roaster.model.JavaUnit;
import org.springframework.ide.vscode.commons.util.Log;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
class DefaultJavaUnitIndex implements JavaUnitIndex {
private LoadingCache<URL, JavaUnit> cache = CacheBuilder.newBuilder().build(new CacheLoader<URL, JavaUnit>() {
@Override
public JavaUnit load(URL url) throws Exception {
InputStream in = url.openStream();
try {
return Roaster.parseUnit(in);
} finally {
in.close();
}
}
});
@Override
public JavaUnit getJavaUnit(URL url) {
try {
return cache.get(url);
} catch (ExecutionException e) {
Log.log(e);
}
return null;
}
}

View File

@@ -0,0 +1,13 @@
package org.springframework.ide.vscode.commons.java.roaster;
import java.net.URL;
import org.jboss.forge.roaster.model.JavaUnit;
public interface JavaUnitIndex {
static final JavaUnitIndex DEFAULT = new DefaultJavaUnitIndex();
JavaUnit getJavaUnit(URL url);
}

View File

@@ -0,0 +1,34 @@
package org.springframework.ide.vscode.commons.java.roaster;
import org.jboss.forge.roaster.model.JavaDoc;
import org.springframework.ide.vscode.commons.javadoc.IJavadoc;
public class RoasterJavadoc implements IJavadoc {
private JavaDoc<?> javadoc;
public RoasterJavadoc(JavaDoc<?> javadoc) {
this.javadoc = javadoc;
}
@Override
public String raw() {
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public String plainText() {
return javadoc.getFullText();
}
@Override
public String html() {
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public String markdown() {
throw new UnsupportedOperationException("Not yet implemented");
}
}

View File

@@ -0,0 +1,102 @@
package org.springframework.ide.vscode.commons.java.roaster;
import org.jboss.forge.roaster.model.Field;
import org.jboss.forge.roaster.model.FieldHolder;
import org.jboss.forge.roaster.model.JavaDocCapable;
import org.jboss.forge.roaster.model.JavaType;
import org.jboss.forge.roaster.model.JavaUnit;
import org.jboss.forge.roaster.model.Method;
import org.jboss.forge.roaster.model.MethodHolder;
import org.jboss.forge.roaster.model.TypeHolder;
import org.jboss.forge.roaster.model.source.JavaClassSource;
import org.springframework.ide.vscode.commons.java.IAnnotation;
import org.springframework.ide.vscode.commons.java.IField;
import org.springframework.ide.vscode.commons.java.IJavadocProvider;
import org.springframework.ide.vscode.commons.java.IMethod;
import org.springframework.ide.vscode.commons.java.IType;
import org.springframework.ide.vscode.commons.javadoc.IJavadoc;
import org.springframework.ide.vscode.commons.javadoc.SourceUrlProvider;
import org.springframework.ide.vscode.commons.util.Log;
public class RoasterJavadocProvider implements IJavadocProvider {
private SourceUrlProvider sourceUrlProvider;
public RoasterJavadocProvider(SourceUrlProvider sourceUrlProvider) {
this.sourceUrlProvider = sourceUrlProvider;
}
@Override
public IJavadoc getJavadoc(IType type) {
try {
JavaClassSource declaration = (JavaClassSource) getDeclaration(type);
return new RoasterJavadoc(declaration.getJavaDoc());
} catch (Exception e) {
Log.log(e);
return null;
}
}
@Override
public IJavadoc getJavadoc(IField field) {
try {
JavaType<?> typeDeclaration = getDeclaration(field.getDeclaringType());
if (typeDeclaration instanceof FieldHolder) {
Field<?> fieldDeclaration = ((FieldHolder<?>)typeDeclaration).getField(field.getElementName());
if (fieldDeclaration instanceof JavaDocCapable) {
return new RoasterJavadoc(((JavaDocCapable<?>)fieldDeclaration).getJavaDoc());
}
}
} catch (Exception e) {
Log.log(e);
}
return null;
}
@Override
public IJavadoc getJavadoc(IMethod method) {
if (method.parameters().findFirst().isPresent()) {
throw new UnsupportedOperationException("Only methods with no parameters are supported");
}
try {
JavaType<?> typeDeclaration = getDeclaration(method.getDeclaringType());
if (typeDeclaration instanceof MethodHolder) {
Method<?, ?> methodDeclaration = ((MethodHolder<?>)typeDeclaration).getMethod(method.getElementName());
if (methodDeclaration instanceof JavaDocCapable) {
return new RoasterJavadoc(((JavaDocCapable<?>)methodDeclaration).getJavaDoc());
}
}
} catch (Exception e) {
Log.log(e);
}
return null;
}
@Override
public IJavadoc getJavadoc(IAnnotation annotation) {
throw new UnsupportedOperationException("Not yet implemented");
}
private JavaUnit getJavaUnit(IType type) throws Exception {
return JavaUnitIndex.DEFAULT.getJavaUnit(sourceUrlProvider.sourceUrl(type));
}
private JavaType<?> getDeclaration(IType type) throws Exception {
if (type == null) {
return null;
}
IType declaringType = type.getDeclaringType();
if (declaringType == null) {
JavaUnit ju = getJavaUnit(type);
return ju.getTopLevelTypes().stream().filter(jt -> jt.getName().equals(type.getElementName())).findFirst().orElse(null);
} else {
JavaType<?> declaringTypeDeclaration = getDeclaration(declaringType);
if (declaringTypeDeclaration instanceof TypeHolder) {
return ((TypeHolder<?>)declaringTypeDeclaration).getNestedType(type.getElementName());
} else {
return null;
}
}
}
}