Hovers for application properties

This commit is contained in:
BoykoAlex
2016-11-22 20:36:53 -05:00
parent 5c6927ac6f
commit 3bf568b6a2
20 changed files with 1142 additions and 514 deletions

View File

@@ -0,0 +1,61 @@
package org.springframework.ide.vscode.commons.jandex;
import java.util.stream.Stream;
import org.jboss.jandex.AnnotationInstance;
import org.springframework.ide.vscode.commons.java.IAnnotation;
import org.springframework.ide.vscode.commons.java.IJavadocProvider;
import org.springframework.ide.vscode.commons.java.IMemberValuePair;
import org.springframework.ide.vscode.commons.javadoc.IJavadoc;
public class AnnotationImpl implements IAnnotation {
private AnnotationInstance annotation;
private IJavadocProvider javadocProvider;
AnnotationImpl(AnnotationInstance annotation, IJavadocProvider javadocProvider) {
this.annotation = annotation;
this.javadocProvider = javadocProvider;
}
@Override
public String getElementName() {
return annotation.name().toString();
}
@Override
public IJavadoc getJavaDoc() {
return javadocProvider == null ? null : javadocProvider.getJavadoc(this);
}
@Override
public boolean exists() {
return true;
}
@Override
public Stream<IMemberValuePair> getMemberValuePairs() {
return annotation.values().stream().map(av -> {
return Wrappers.wrap(av);
});
}
@Override
public String toString() {
return annotation.toString();
}
@Override
public int hashCode() {
return annotation.toString().hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj instanceof AnnotationImpl) {
return annotation.toString().equals(((AnnotationImpl)obj).annotation.toString());
}
return super.equals(obj);
}
}

View File

@@ -0,0 +1,82 @@
package org.springframework.ide.vscode.commons.jandex;
import java.util.stream.Stream;
import org.jboss.jandex.FieldInfo;
import org.springframework.ide.vscode.commons.java.Flags;
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.IType;
import org.springframework.ide.vscode.commons.javadoc.IJavadoc;
class FieldImpl implements IField {
private JandexIndex index;
private FieldInfo field;
private IJavadocProvider javadocProvider;
FieldImpl(JandexIndex index, FieldInfo field, IJavadocProvider javadocProvider) {
this.index = index;
this.field = field;
this.javadocProvider = javadocProvider;
}
@Override
public int getFlags() {
return field.flags();
}
@Override
public IType getDeclaringType() {
return Wrappers.wrap(index, field.declaringClass(), javadocProvider);
}
@Override
public String getElementName() {
return field.name();
}
@Override
public IJavadoc getJavaDoc() {
return javadocProvider == null ? null : javadocProvider.getJavadoc(this);
}
@Override
public boolean exists() {
return true;
}
@Override
public Stream<IAnnotation> getAnnotations() {
return field.annotations().stream().map(a -> {
return Wrappers.wrap(a, javadocProvider);
});
}
@Override
public boolean isEnumConstant() {
return Flags.isEnum(field.flags());
}
@Override
public String toString() {
return field.toString();
}
@Override
public int hashCode() {
return field.toString().hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj instanceof FieldImpl) {
return field.toString().equals(((FieldImpl)obj).field.toString());
}
return super.equals(obj);
}
}

View File

@@ -0,0 +1,102 @@
package org.springframework.ide.vscode.commons.jandex;
import java.util.stream.Stream;
import org.jboss.jandex.MethodInfo;
import org.springframework.ide.vscode.commons.java.IAnnotation;
import org.springframework.ide.vscode.commons.java.IJavaType;
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;
public class MethodImpl implements IMethod {
private static final String JANDEX_CONTRUCTOR_NAME = "<init>";
private JandexIndex index;
private MethodInfo method;
private IJavadocProvider javadocProvider;
MethodImpl(JandexIndex index, MethodInfo method, IJavadocProvider javadocProvider) {
this.index = index;
this.method = method;
this.javadocProvider =javadocProvider;
}
@Override
public int getFlags() {
return method.flags();
}
@Override
public boolean isConstructor() {
return method.name().equals(JANDEX_CONTRUCTOR_NAME);
}
@Override
public IType getDeclaringType() {
return Wrappers.wrap(index, method.declaringClass(), javadocProvider);
}
@Override
public String getElementName() {
return isConstructor() ? getDeclaringType().getElementName() : method.name();
}
@Override
public IJavadoc getJavaDoc() {
return javadocProvider == null ? null : javadocProvider.getJavadoc(this);
}
@Override
public boolean exists() {
return true;
}
@Override
public Stream<IAnnotation> getAnnotations() {
return method.annotations().stream().map(a -> Wrappers.wrap(a, javadocProvider));
}
@Override
public IJavaType getReturnType() {
return Wrappers.wrap(method.returnType());
}
// @Override
// public String getSignature() {
// StringBuilder sb = new StringBuilder();
// sb.append('(');
// method.parameters().forEach(p -> sb.append(signature(p)));
// sb.append(')');
// sb.append(getReturnType());
// return sb.toString();
// }
@Override
public String toString() {
return method.toString();
}
@Override
public Stream<IJavaType> parameters() {
return method.parameters().stream().map(Wrappers::wrap);
}
@Override
public int hashCode() {
return method.toString().hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj instanceof MethodImpl) {
return method.toString().equals(((MethodImpl)obj).method.toString());
}
return super.equals(obj);
}
}

View File

@@ -0,0 +1,132 @@
package org.springframework.ide.vscode.commons.jandex;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.jboss.jandex.ClassInfo;
import org.jboss.jandex.DotName;
import org.jboss.jandex.Type;
import org.springframework.ide.vscode.commons.java.Flags;
import org.springframework.ide.vscode.commons.java.IAnnotation;
import org.springframework.ide.vscode.commons.java.IField;
import org.springframework.ide.vscode.commons.java.IJavaType;
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;
class TypeImpl implements IType {
private ClassInfo info;
private JandexIndex index;
private IJavadocProvider javadocProvider;
TypeImpl(JandexIndex index, ClassInfo info, IJavadocProvider javadocProvider) {
this.info = info;
this.index = index;
this.javadocProvider = javadocProvider;
}
@Override
public int getFlags() {
return info.flags();
}
@Override
public IType getDeclaringType() {
DotName enclosingClass = info.enclosingClass();
return enclosingClass == null ? null : index.getClassByName(enclosingClass);
}
@Override
public String getElementName() {
return info.simpleName() == null ? info.name().local() : info.simpleName();
}
@Override
public IJavadoc getJavaDoc() {
return javadocProvider == null ? null : javadocProvider.getJavadoc(this);
}
@Override
public boolean exists() {
return true;
}
@Override
public Stream<IAnnotation> getAnnotations() {
// TODO: check correctness!
return info.annotations().get(info.name()).stream().map(a -> Wrappers.wrap(a, javadocProvider));
}
@Override
public boolean isClass() {
return true;
}
@Override
public boolean isEnum() {
return Flags.isEnum(info.flags());
}
@Override
public boolean isInterface() {
return Flags.isInterface(info.flags());
}
@Override
public boolean isAnnotation() {
return Flags.isAnnotation(info.flags());
}
@Override
public String getFullyQualifiedName() {
return info.name().toString();
}
@Override
public IField getField(String name) {
return Wrappers.wrap(index, info.field(name), javadocProvider);
}
@Override
public Stream<IField> getFields() {
return info.fields().stream().map(f -> {
return Wrappers.wrap(index, f, javadocProvider);
});
}
@Override
public IMethod getMethod(String name, Stream<IJavaType> parameters) {
List<Type> typeParameters = parameters.map(Wrappers::from).collect(Collectors.toList());
return Wrappers.wrap(index, info.method(name, typeParameters.toArray(new Type[typeParameters.size()])), javadocProvider);
}
@Override
public Stream<IMethod> getMethods() {
return info.methods().stream().map(m -> {
return Wrappers.wrap(index, m, javadocProvider);
});
}
@Override
public String toString() {
return info.toString();
}
@Override
public int hashCode() {
return info.toString().hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj instanceof TypeImpl) {
return info.toString().equals(((TypeImpl)obj).info.toString());
}
return super.equals(obj);
}
}

View File

@@ -2,20 +2,14 @@ package org.springframework.ide.vscode.commons.jandex;
import static org.springframework.ide.vscode.commons.util.Assert.isNotNull;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.jboss.jandex.AnnotationInstance;
import org.jboss.jandex.AnnotationValue;
import org.jboss.jandex.ClassInfo;
import org.jboss.jandex.DotName;
import org.jboss.jandex.FieldInfo;
import org.jboss.jandex.MethodInfo;
import org.jboss.jandex.PrimitiveType;
import org.jboss.jandex.Type;
import org.jboss.jandex.Type.Kind;
import org.springframework.ide.vscode.commons.java.Flags;
import org.springframework.ide.vscode.commons.java.IAnnotation;
import org.springframework.ide.vscode.commons.java.IField;
import org.springframework.ide.vscode.commons.java.IJavaType;
@@ -25,257 +19,32 @@ import org.springframework.ide.vscode.commons.java.IMethod;
import org.springframework.ide.vscode.commons.java.IPrimitiveType;
import org.springframework.ide.vscode.commons.java.IType;
import org.springframework.ide.vscode.commons.java.IVoidType;
import org.springframework.ide.vscode.commons.javadoc.IJavadoc;
public class Wrappers {
private static final String JANDEX_CONTRUCTOR_NAME = "<init>";
public static IType wrap(JandexIndex index, ClassInfo info, IJavadocProvider javadocProvider) {
if (info == null) {
return null;
}
return new IType() {
@Override
public int getFlags() {
return info.flags();
}
@Override
public IType getDeclaringType() {
DotName enclosingClass = info.enclosingClass();
return enclosingClass == null ? null : index.getClassByName(enclosingClass);
}
@Override
public String getElementName() {
return info.simpleName() == null ? info.name().local() : info.simpleName();
}
@Override
public IJavadoc getJavaDoc() {
return javadocProvider == null ? null : javadocProvider.getJavadoc(this);
}
@Override
public boolean exists() {
return true;
}
@Override
public Stream<IAnnotation> getAnnotations() {
// TODO: check correctness!
return info.annotations().get(info.name()).stream().map(a -> wrap(a, javadocProvider));
}
@Override
public boolean isClass() {
return true;
}
@Override
public boolean isEnum() {
return Flags.isEnum(info.flags());
}
@Override
public boolean isInterface() {
return Flags.isInterface(info.flags());
}
@Override
public boolean isAnnotation() {
return Flags.isAnnotation(info.flags());
}
@Override
public String getFullyQualifiedName() {
return info.name().toString();
}
@Override
public IField getField(String name) {
return wrap(index, info.field(name), javadocProvider);
}
@Override
public Stream<IField> getFields() {
return info.fields().stream().map(f -> {
return wrap(index, f, javadocProvider);
});
}
@Override
public IMethod getMethod(String name, Stream<IJavaType> parameters) {
List<Type> typeParameters = parameters.map(Wrappers::from).collect(Collectors.toList());
return wrap(index, info.method(name, typeParameters.toArray(new Type[typeParameters.size()])), javadocProvider);
}
@Override
public Stream<IMethod> getMethods() {
return info.methods().stream().map(m -> {
return wrap(index, m, javadocProvider);
});
}
@Override
public String toString() {
return info.toString();
}
};
return new TypeImpl(index, info, javadocProvider);
}
public static IField wrap(JandexIndex index, FieldInfo field, IJavadocProvider javadocProvider) {
if (field == null) {
return null;
}
return new IField() {
@Override
public int getFlags() {
return field.flags();
}
@Override
public IType getDeclaringType() {
return wrap(index, field.declaringClass(), javadocProvider);
}
@Override
public String getElementName() {
return field.name();
}
@Override
public IJavadoc getJavaDoc() {
return javadocProvider == null ? null : javadocProvider.getJavadoc(this);
}
@Override
public boolean exists() {
return true;
}
@Override
public Stream<IAnnotation> getAnnotations() {
return field.annotations().stream().map(a -> {
return wrap(a, javadocProvider);
});
}
@Override
public boolean isEnumConstant() {
return Flags.isEnum(field.flags());
}
@Override
public String toString() {
return field.toString();
}
};
return new FieldImpl(index, field, javadocProvider);
}
public static IMethod wrap(JandexIndex index, MethodInfo method, IJavadocProvider javadocProvider) {
isNotNull(index);
isNotNull(method);
return new IMethod() {
@Override
public int getFlags() {
return method.flags();
}
@Override
public boolean isConstructor() {
return method.name().equals(JANDEX_CONTRUCTOR_NAME);
}
@Override
public IType getDeclaringType() {
return wrap(index, method.declaringClass(), javadocProvider);
}
@Override
public String getElementName() {
return isConstructor() ? getDeclaringType().getElementName() : method.name();
}
@Override
public IJavadoc getJavaDoc() {
return javadocProvider == null ? null : javadocProvider.getJavadoc(this);
}
@Override
public boolean exists() {
return true;
}
@Override
public Stream<IAnnotation> getAnnotations() {
return method.annotations().stream().map(a -> wrap(a, javadocProvider));
}
@Override
public IJavaType getReturnType() {
return wrap(method.returnType());
}
// @Override
// public String getSignature() {
// StringBuilder sb = new StringBuilder();
// sb.append('(');
// method.parameters().forEach(p -> sb.append(signature(p)));
// sb.append(')');
// sb.append(getReturnType());
// return sb.toString();
// }
@Override
public String toString() {
return method.toString();
}
@Override
public Stream<IJavaType> parameters() {
return method.parameters().stream().map(Wrappers::wrap);
}
};
return new MethodImpl(index, method, javadocProvider);
}
public static IAnnotation wrap(AnnotationInstance annotation, IJavadocProvider javadocProvider) {
isNotNull(annotation);
return new IAnnotation() {
@Override
public String getElementName() {
return annotation.name().toString();
}
@Override
public IJavadoc getJavaDoc() {
return javadocProvider == null ? null : javadocProvider.getJavadoc(this);
}
@Override
public boolean exists() {
return true;
}
@Override
public Stream<IMemberValuePair> getMemberValuePairs() {
return annotation.values().stream().map(av -> {
return wrap(av);
});
}
@Override
public String toString() {
return annotation.toString();
}
};
return new AnnotationImpl(annotation, javadocProvider);
}
public static IMemberValuePair wrap(AnnotationValue annotationValue) {
@@ -324,7 +93,7 @@ public class Wrappers {
}
@SuppressWarnings("unchecked")
private static Type from(IJavaType type) {
static Type from(IJavaType type) {
if (type == IPrimitiveType.BOOLEAN) {
return PrimitiveType.BOOLEAN;
} else if (type == IPrimitiveType.BYTE) {

View File

@@ -12,6 +12,7 @@ public interface JavadocConstants {
char[] FIELD_DETAIL= "<!-- ============ FIELD DETAIL =========== -->".toCharArray(); //$NON-NLS-1$
char[] FIELD_SUMMARY = "<!-- =========== FIELD SUMMARY =========== -->".toCharArray(); //$NON-NLS-1$
char[] ENUM_CONSTANT_SUMMARY = "<!-- =========== ENUM CONSTANT SUMMARY =========== -->".toCharArray(); //$NON-NLS-1$
char[] ENUM_CONSTANT_DETAIL = "<!-- ============ ENUM CONSTANT DETAIL =========== -->".toCharArray();
char[] ANNOTATION_TYPE_REQUIRED_MEMBER_SUMMARY = "<!-- =========== ANNOTATION TYPE REQUIRED MEMBER SUMMARY =========== -->".toCharArray(); //$NON-NLS-1$
char[] ANNOTATION_TYPE_OPTIONAL_MEMBER_SUMMARY = "<!-- =========== ANNOTATION TYPE OPTIONAL MEMBER SUMMARY =========== -->".toCharArray(); //$NON-NLS-1$
char[] END_OF_CLASS_DATA = "<!-- ========= END OF CLASS DATA ========= -->".toCharArray(); //$NON-NLS-1$

View File

@@ -17,11 +17,13 @@ public class JavadocContents {
private boolean hasComputedChildrenSections = false;
private int indexOfFieldDetails;
private int indexOfEnumConstantsDetails;
private int indexOfConstructorDetails;
private int indexOfMethodDetails;
private int indexOfEndOfClassData;
private int indexOfFieldsBottom;
private int indexOfEnumConstantsBottom;
private int indexOfAllMethodsTop;
private int indexOfAllMethodsBottom;
@@ -225,10 +227,14 @@ public class JavadocContents {
int lastIndex = CharOperation.indexOf(JavadocConstants.SEPARATOR_START, this.content, false, this.childrenStart);
lastIndex = lastIndex == -1 ? this.childrenStart : lastIndex;
// try to find enum cosntants detail start
this.indexOfEnumConstantsDetails = CharOperation.indexOf(JavadocConstants.ENUM_CONSTANT_DETAIL, this.content, false, lastIndex);
lastIndex = this.indexOfEnumConstantsDetails == -1 ? lastIndex : this.indexOfEnumConstantsDetails;
// try to find field detail start
this.indexOfFieldDetails = CharOperation.indexOf(JavadocConstants.FIELD_DETAIL, this.content, false, lastIndex);
lastIndex = this.indexOfFieldDetails == -1 ? lastIndex : this.indexOfFieldDetails;
// try to find constructor detail start
this.indexOfConstructorDetails = CharOperation.indexOf(JavadocConstants.CONSTRUCTOR_DETAIL, this.content, false, lastIndex);
lastIndex = this.indexOfConstructorDetails == -1 ? lastIndex : this.indexOfConstructorDetails;
@@ -243,6 +249,16 @@ public class JavadocContents {
int[] classDataRange = sanitizeRange(new int[] { indexOfStartOfClassData + JavadocConstants.START_OF_CLASS_DATA.length, indexOfEndOfClassData}, "ul", "li", "div");
this.indexOfEndOfClassData = classDataRange[1];
// try to find enum constants bottom
this.indexOfEnumConstantsBottom = this.indexOfFieldDetails != -1 ? this.indexOfFieldDetails
: this.indexOfConstructorDetails != -1 ? this.indexOfConstructorDetails
: this.indexOfMethodDetails != -1 ? this.indexOfMethodDetails : this.indexOfEndOfClassData;
// Get rid of possible <ul><li> tag wrappers
int[] fieldsRange = sanitizeRange(new int[] {indexOfEnumConstantsDetails + JavadocConstants.ENUM_CONSTANT_DETAIL.length, indexOfEnumConstantsBottom}, "ul", "li", "div");
indexOfEnumConstantsDetails = fieldsRange[0];
indexOfEnumConstantsBottom = fieldsRange[1];
// try to find the field detail end
this.indexOfFieldsBottom =
this.indexOfConstructorDetails != -1 ? this.indexOfConstructorDetails :
@@ -257,7 +273,7 @@ public class JavadocContents {
this.indexOfAllMethodsBottom = this.indexOfEndOfClassData;
// Get rid of possible <ul><li> tag wrappers
int[] fieldsRange = sanitizeRange(new int[] {indexOfFieldDetails + JavadocConstants.FIELD_DETAIL.length, indexOfFieldsBottom}, "ul", "li", "div");
fieldsRange = sanitizeRange(new int[] {indexOfFieldDetails + JavadocConstants.FIELD_DETAIL.length, indexOfFieldsBottom}, "ul", "li", "div");
indexOfFieldDetails = fieldsRange[0];
indexOfFieldsBottom = fieldsRange[1];
@@ -303,8 +319,10 @@ public class JavadocContents {
char[] anchor = String.valueOf(buffer).toCharArray();
int[] range = null;
int top = field.isEnumConstant() ? this.indexOfEnumConstantsDetails : this.indexOfFieldDetails;
int bottom = field.isEnumConstant() ? this.indexOfEnumConstantsBottom : this.indexOfFieldsBottom;
if (this.indexOfFieldDetails == -1 || this.indexOfFieldsBottom == -1) {
if (top == -1 || bottom == -1) {
// the detail section has no top or bottom, so the doc has an unknown format
if (this.unknownFormatAnchorIndexes == null) {
this.unknownFormatAnchorIndexes = new int[(int)type.getFields().count()];
@@ -316,7 +334,7 @@ public class JavadocContents {
this.tempAnchorIndexesCount = this.unknownFormatAnchorIndexesCount;
this.tempLastAnchorFoundIndex = this.unknownFormatLastAnchorFoundIndex;
range = computeChildRange(anchor, this.indexOfFieldsBottom);
range = computeChildRange(anchor, bottom);
this.unknownFormatLastAnchorFoundIndex = this.tempLastAnchorFoundIndex;
this.unknownFormatAnchorIndexesCount = this.tempAnchorIndexesCount;
@@ -325,14 +343,14 @@ public class JavadocContents {
if (this.fieldAnchorIndexes == null) {
this.fieldAnchorIndexes = new int[(int)type.getFields().count()];
this.fieldAnchorIndexesCount = 0;
this.fieldLastAnchorFoundIndex = this.indexOfFieldDetails;
this.fieldLastAnchorFoundIndex = top;
}
this.tempAnchorIndexes = this.fieldAnchorIndexes;
this.tempAnchorIndexesCount = this.fieldAnchorIndexesCount;
this.tempLastAnchorFoundIndex = this.fieldLastAnchorFoundIndex;
range = computeChildRange(anchor, this.indexOfFieldsBottom);
range = computeChildRange(anchor, bottom);
this.fieldLastAnchorFoundIndex = this.tempLastAnchorFoundIndex;
this.fieldAnchorIndexesCount = this.tempAnchorIndexesCount;