blob: 51b380b9fcf1616501a3bd8e162e8c670e31009a [file] [log] [blame]
/**
* Copyright (c) 2016 TypeFox and others.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
package org.eclipse.lsp4j.generator;
import java.io.InputStream;
import java.net.URI;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import org.eclipse.lsp4j.generator.EitherTypeArgument;
import org.eclipse.lsp4j.generator.JsonType;
import org.eclipse.lsp4j.jsonrpc.messages.Either;
import org.eclipse.xtend.lib.annotations.AccessorType;
import org.eclipse.xtend.lib.annotations.Accessors;
import org.eclipse.xtend.lib.annotations.Delegate;
import org.eclipse.xtend.lib.macro.TransformationContext;
import org.eclipse.xtend.lib.macro.declaration.AnnotationReference;
import org.eclipse.xtend.lib.macro.declaration.Element;
import org.eclipse.xtend.lib.macro.declaration.InterfaceDeclaration;
import org.eclipse.xtend.lib.macro.declaration.MutableAnnotationTypeDeclaration;
import org.eclipse.xtend.lib.macro.declaration.MutableClassDeclaration;
import org.eclipse.xtend.lib.macro.declaration.MutableElement;
import org.eclipse.xtend.lib.macro.declaration.MutableEnumerationTypeDeclaration;
import org.eclipse.xtend.lib.macro.declaration.MutableInterfaceDeclaration;
import org.eclipse.xtend.lib.macro.declaration.Type;
import org.eclipse.xtend.lib.macro.declaration.TypeReference;
import org.eclipse.xtend.lib.macro.file.Path;
import org.eclipse.xtend.lib.macro.services.AnnotationReferenceBuildContext;
import org.eclipse.xtend.lib.macro.services.Problem;
import org.eclipse.xtext.xbase.lib.CollectionLiterals;
import org.eclipse.xtext.xbase.lib.Functions.Function1;
import org.eclipse.xtext.xbase.lib.IterableExtensions;
import org.eclipse.xtext.xbase.lib.Procedures.Procedure0;
import org.eclipse.xtext.xbase.lib.Procedures.Procedure1;
import org.eclipse.xtext.xbase.lib.Pure;
@SuppressWarnings("all")
public class JsonRpcDataTransformationContext implements TransformationContext {
@Delegate
private final TransformationContext delegate;
@Accessors(AccessorType.PUBLIC_GETTER)
private final TypeReference eitherType;
public JsonRpcDataTransformationContext(final TransformationContext delegate) {
this.delegate = delegate;
this.eitherType = this.newTypeReference(Either.class);
}
public boolean isEither(final TypeReference typeReference) {
return ((typeReference != null) && this.eitherType.isAssignableFrom(typeReference));
}
public TypeReference getLeftType(final TypeReference typeReference) {
final Type type = typeReference.getType();
Type _type = this.eitherType.getType();
boolean _tripleEquals = (type == _type);
if (_tripleEquals) {
return IterableExtensions.<TypeReference>head(typeReference.getActualTypeArguments());
}
if ((type instanceof InterfaceDeclaration)) {
final Function1<TypeReference, TypeReference> _function = (TypeReference it) -> {
return this.getLeftType(it);
};
return IterableExtensions.<TypeReference>head(IterableExtensions.<TypeReference>filterNull(IterableExtensions.map(((InterfaceDeclaration)type).getExtendedInterfaces(), _function)));
}
return null;
}
public TypeReference getRightType(final TypeReference typeReference) {
final Type type = typeReference.getType();
Type _type = this.eitherType.getType();
boolean _tripleEquals = (type == _type);
if (_tripleEquals) {
return IterableExtensions.<TypeReference>last(typeReference.getActualTypeArguments());
}
if ((type instanceof InterfaceDeclaration)) {
final Function1<TypeReference, TypeReference> _function = (TypeReference it) -> {
return this.getRightType(it);
};
return IterableExtensions.<TypeReference>head(IterableExtensions.<TypeReference>filterNull(IterableExtensions.map(((InterfaceDeclaration)type).getExtendedInterfaces(), _function)));
}
return null;
}
public Collection<EitherTypeArgument> getChildTypes(final TypeReference typeReference) {
final ArrayList<EitherTypeArgument> types = CollectionLiterals.<EitherTypeArgument>newArrayList();
boolean _isEither = this.isEither(typeReference);
if (_isEither) {
this.collectChildTypes(this.getLeftType(typeReference), null, false, types);
this.collectChildTypes(this.getRightType(typeReference), null, true, types);
}
return types;
}
protected void collectChildTypes(final TypeReference type, final EitherTypeArgument parent, final boolean right, final Collection<EitherTypeArgument> types) {
final EitherTypeArgument argument = new EitherTypeArgument(type, parent, right);
boolean _isEither = this.isEither(type);
if (_isEither) {
this.collectChildTypes(this.getLeftType(type), argument, false, types);
this.collectChildTypes(this.getRightType(type), argument, true, types);
} else {
if ((type != null)) {
types.add(argument);
}
}
}
public boolean isJsonNull(final TypeReference type) {
JsonType _jsonType = this.getJsonType(type);
return (_jsonType == JsonType.NULL);
}
public boolean isJsonString(final TypeReference type) {
JsonType _jsonType = this.getJsonType(type);
return (_jsonType == JsonType.STRING);
}
public boolean isJsonNumber(final TypeReference type) {
JsonType _jsonType = this.getJsonType(type);
return (_jsonType == JsonType.NUMBER);
}
public boolean isJsonBoolean(final TypeReference type) {
JsonType _jsonType = this.getJsonType(type);
return (_jsonType == JsonType.BOOLEAN);
}
public boolean isJsonArray(final TypeReference type) {
JsonType _jsonType = this.getJsonType(type);
return (_jsonType == JsonType.ARRAY);
}
public boolean isJsonObject(final TypeReference type) {
JsonType _jsonType = this.getJsonType(type);
return (_jsonType == JsonType.OBJECT);
}
public JsonType getJsonType(final TypeReference type) {
if ((type == null)) {
return JsonType.NULL;
}
if ((type.isArray() || this.newTypeReference(List.class).isAssignableFrom(type))) {
return JsonType.ARRAY;
}
if ((this.newTypeReference(Enum.class).isAssignableFrom(type) || this.newTypeReference(Number.class).isAssignableFrom(type))) {
return JsonType.NUMBER;
}
boolean _isAssignableFrom = this.newTypeReference(Boolean.class).isAssignableFrom(type);
if (_isAssignableFrom) {
return JsonType.BOOLEAN;
}
if ((this.newTypeReference(String.class).isAssignableFrom(type) || this.newTypeReference(Character.class).isAssignableFrom(type))) {
return JsonType.STRING;
}
boolean _isPrimitive = type.isPrimitive();
boolean _not = (!_isPrimitive);
if (_not) {
return JsonType.OBJECT;
}
throw new IllegalStateException(("Unexpected type reference: " + type));
}
public void addError(final Element arg0, final String arg1) {
this.delegate.addError(arg0, arg1);
}
public void addWarning(final Element arg0, final String arg1) {
this.delegate.addWarning(arg0, arg1);
}
public boolean exists(final Path arg0) {
return this.delegate.exists(arg0);
}
public MutableAnnotationTypeDeclaration findAnnotationType(final String arg0) {
return this.delegate.findAnnotationType(arg0);
}
public MutableClassDeclaration findClass(final String arg0) {
return this.delegate.findClass(arg0);
}
public MutableEnumerationTypeDeclaration findEnumerationType(final String arg0) {
return this.delegate.findEnumerationType(arg0);
}
public MutableInterfaceDeclaration findInterface(final String arg0) {
return this.delegate.findInterface(arg0);
}
public Type findTypeGlobally(final Class<?> arg0) {
return this.delegate.findTypeGlobally(arg0);
}
public Type findTypeGlobally(final String arg0) {
return this.delegate.findTypeGlobally(arg0);
}
public TypeReference getAnyType() {
return this.delegate.getAnyType();
}
public String getCharset(final Path arg0) {
return this.delegate.getCharset(arg0);
}
public Iterable<? extends Path> getChildren(final Path arg0) {
return this.delegate.getChildren(arg0);
}
public CharSequence getContents(final Path arg0) {
return this.delegate.getContents(arg0);
}
public InputStream getContentsAsStream(final Path arg0) {
return this.delegate.getContentsAsStream(arg0);
}
public long getLastModification(final Path arg0) {
return this.delegate.getLastModification(arg0);
}
public TypeReference getList(final TypeReference arg0) {
return this.delegate.getList(arg0);
}
public TypeReference getObject() {
return this.delegate.getObject();
}
public Element getPrimaryGeneratedJavaElement(final Element arg0) {
return this.delegate.getPrimaryGeneratedJavaElement(arg0);
}
public Element getPrimarySourceElement(final Element arg0) {
return this.delegate.getPrimarySourceElement(arg0);
}
public TypeReference getPrimitiveBoolean() {
return this.delegate.getPrimitiveBoolean();
}
public TypeReference getPrimitiveByte() {
return this.delegate.getPrimitiveByte();
}
public TypeReference getPrimitiveChar() {
return this.delegate.getPrimitiveChar();
}
public TypeReference getPrimitiveDouble() {
return this.delegate.getPrimitiveDouble();
}
public TypeReference getPrimitiveFloat() {
return this.delegate.getPrimitiveFloat();
}
public TypeReference getPrimitiveInt() {
return this.delegate.getPrimitiveInt();
}
public TypeReference getPrimitiveLong() {
return this.delegate.getPrimitiveLong();
}
public TypeReference getPrimitiveShort() {
return this.delegate.getPrimitiveShort();
}
public TypeReference getPrimitiveVoid() {
return this.delegate.getPrimitiveVoid();
}
public List<? extends Problem> getProblems(final Element arg0) {
return this.delegate.getProblems(arg0);
}
public Path getProjectFolder(final Path arg0) {
return this.delegate.getProjectFolder(arg0);
}
public Set<Path> getProjectSourceFolders(final Path arg0) {
return this.delegate.getProjectSourceFolders(arg0);
}
public TypeReference getSet(final TypeReference arg0) {
return this.delegate.getSet(arg0);
}
public Path getSourceFolder(final Path arg0) {
return this.delegate.getSourceFolder(arg0);
}
public TypeReference getString() {
return this.delegate.getString();
}
public Path getTargetFolder(final Path arg0) {
return this.delegate.getTargetFolder(arg0);
}
public boolean isExternal(final Element arg0) {
return this.delegate.isExternal(arg0);
}
public boolean isFile(final Path arg0) {
return this.delegate.isFile(arg0);
}
public boolean isFolder(final Path arg0) {
return this.delegate.isFolder(arg0);
}
public boolean isGenerated(final Element arg0) {
return this.delegate.isGenerated(arg0);
}
public boolean isSource(final Element arg0) {
return this.delegate.isSource(arg0);
}
public boolean isThePrimaryGeneratedJavaElement(final Element arg0) {
return this.delegate.isThePrimaryGeneratedJavaElement(arg0);
}
public AnnotationReference newAnnotationReference(final AnnotationReference arg0) {
return this.delegate.newAnnotationReference(arg0);
}
public AnnotationReference newAnnotationReference(final AnnotationReference arg0, final Procedure1<AnnotationReferenceBuildContext> arg1) {
return this.delegate.newAnnotationReference(arg0, arg1);
}
public AnnotationReference newAnnotationReference(final Class<?> arg0) {
return this.delegate.newAnnotationReference(arg0);
}
public AnnotationReference newAnnotationReference(final Class<?> arg0, final Procedure1<AnnotationReferenceBuildContext> arg1) {
return this.delegate.newAnnotationReference(arg0, arg1);
}
public AnnotationReference newAnnotationReference(final String arg0) {
return this.delegate.newAnnotationReference(arg0);
}
public AnnotationReference newAnnotationReference(final String arg0, final Procedure1<AnnotationReferenceBuildContext> arg1) {
return this.delegate.newAnnotationReference(arg0, arg1);
}
public AnnotationReference newAnnotationReference(final Type arg0) {
return this.delegate.newAnnotationReference(arg0);
}
public AnnotationReference newAnnotationReference(final Type arg0, final Procedure1<AnnotationReferenceBuildContext> arg1) {
return this.delegate.newAnnotationReference(arg0, arg1);
}
public TypeReference newArrayTypeReference(final TypeReference arg0) {
return this.delegate.newArrayTypeReference(arg0);
}
public TypeReference newSelfTypeReference(final Type arg0) {
return this.delegate.newSelfTypeReference(arg0);
}
public TypeReference newTypeReference(final Class<?> arg0, final TypeReference... arg1) {
return this.delegate.newTypeReference(arg0, arg1);
}
public TypeReference newTypeReference(final String arg0, final TypeReference... arg1) {
return this.delegate.newTypeReference(arg0, arg1);
}
public TypeReference newTypeReference(final Type arg0, final TypeReference... arg1) {
return this.delegate.newTypeReference(arg0, arg1);
}
public TypeReference newWildcardTypeReference() {
return this.delegate.newWildcardTypeReference();
}
public TypeReference newWildcardTypeReference(final TypeReference arg0) {
return this.delegate.newWildcardTypeReference(arg0);
}
public TypeReference newWildcardTypeReferenceWithLowerBound(final TypeReference arg0) {
return this.delegate.newWildcardTypeReferenceWithLowerBound(arg0);
}
public void setPrimarySourceElement(final MutableElement arg0, final Element arg1) {
this.delegate.setPrimarySourceElement(arg0, arg1);
}
public URI toURI(final Path arg0) {
return this.delegate.toURI(arg0);
}
public void validateLater(final Procedure0 arg0) {
this.delegate.validateLater(arg0);
}
@Pure
public TypeReference getEitherType() {
return this.eitherType;
}
}