Skip to content

Commit

Permalink
Reimplement receiver parameters
Browse files Browse the repository at this point in the history
  • Loading branch information
matozoid committed Oct 16, 2017
1 parent f3744df commit 2e435be
Show file tree
Hide file tree
Showing 12 changed files with 295 additions and 52 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@
import static com.github.javaparser.utils.Utils.assertNotNull;
import static java.util.stream.Collectors.joining;
import static java.util.stream.Collectors.toList;

import java.util.Optional;
import java.util.function.Consumer;

/**
Expand All @@ -60,20 +62,23 @@ public abstract class CallableDeclaration<T extends CallableDeclaration<?>> exte

private NodeList<ReferenceType> thrownExceptions;

private ReceiverParameter receiverParameter;

@AllFieldsConstructor
public CallableDeclaration(EnumSet<Modifier> modifiers, NodeList<AnnotationExpr> annotations, NodeList<TypeParameter> typeParameters, SimpleName name, NodeList<Parameter> parameters, NodeList<ReferenceType> thrownExceptions) {
this(null, modifiers, annotations, typeParameters, name, parameters, thrownExceptions);
public CallableDeclaration(EnumSet<Modifier> modifiers, NodeList<AnnotationExpr> annotations, NodeList<TypeParameter> typeParameters, SimpleName name, NodeList<Parameter> parameters, NodeList<ReferenceType> thrownExceptions, ReceiverParameter receiverParameter) {
this(null, modifiers, annotations, typeParameters, name, parameters, thrownExceptions, receiverParameter);
}

/**This constructor is used by the parser and is considered private.*/
@Generated("com.github.javaparser.generator.core.node.MainConstructorGenerator")
public CallableDeclaration(TokenRange tokenRange, EnumSet<Modifier> modifiers, NodeList<AnnotationExpr> annotations, NodeList<TypeParameter> typeParameters, SimpleName name, NodeList<Parameter> parameters, NodeList<ReferenceType> thrownExceptions) {
public CallableDeclaration(TokenRange tokenRange, EnumSet<Modifier> modifiers, NodeList<AnnotationExpr> annotations, NodeList<TypeParameter> typeParameters, SimpleName name, NodeList<Parameter> parameters, NodeList<ReferenceType> thrownExceptions, ReceiverParameter receiverParameter) {
super(tokenRange, annotations);
setModifiers(modifiers);
setTypeParameters(typeParameters);
setName(name);
setParameters(parameters);
setThrownExceptions(thrownExceptions);
setReceiverParameter(receiverParameter);
customInitialization();
}

Expand Down Expand Up @@ -375,4 +380,12 @@ public CallableDeclaration asCallableDeclaration() {
public void ifCallableDeclaration(Consumer<CallableDeclaration> action) {
action.accept(this);
}

public Optional<ReceiverParameter> getReceiverParameter() {
return Optional.ofNullable(receiverParameter);
}

public void setReceiverParameter(ReceiverParameter receiverParameter) {
this.receiverParameter = receiverParameter;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -59,26 +59,26 @@ public final class ConstructorDeclaration extends CallableDeclaration<Constructo
private BlockStmt body;

public ConstructorDeclaration() {
this(null, EnumSet.noneOf(Modifier.class), new NodeList<>(), new NodeList<>(), new SimpleName(), new NodeList<>(), new NodeList<>(), new BlockStmt());
this(null, EnumSet.noneOf(Modifier.class), new NodeList<>(), new NodeList<>(), new SimpleName(), new NodeList<>(), new NodeList<>(), new BlockStmt(), null);
}

public ConstructorDeclaration(String name) {
this(null, EnumSet.of(Modifier.PUBLIC), new NodeList<>(), new NodeList<>(), new SimpleName(name), new NodeList<>(), new NodeList<>(), new BlockStmt());
this(null, EnumSet.of(Modifier.PUBLIC), new NodeList<>(), new NodeList<>(), new SimpleName(name), new NodeList<>(), new NodeList<>(), new BlockStmt(), null);
}

public ConstructorDeclaration(EnumSet<Modifier> modifiers, String name) {
this(null, modifiers, new NodeList<>(), new NodeList<>(), new SimpleName(name), new NodeList<>(), new NodeList<>(), new BlockStmt());
this(null, modifiers, new NodeList<>(), new NodeList<>(), new SimpleName(name), new NodeList<>(), new NodeList<>(), new BlockStmt(), null);
}

@AllFieldsConstructor
public ConstructorDeclaration(EnumSet<Modifier> modifiers, NodeList<AnnotationExpr> annotations, NodeList<TypeParameter> typeParameters, SimpleName name, NodeList<Parameter> parameters, NodeList<ReferenceType> thrownExceptions, BlockStmt body) {
this(null, modifiers, annotations, typeParameters, name, parameters, thrownExceptions, body);
public ConstructorDeclaration(EnumSet<Modifier> modifiers, NodeList<AnnotationExpr> annotations, NodeList<TypeParameter> typeParameters, SimpleName name, NodeList<Parameter> parameters, NodeList<ReferenceType> thrownExceptions, BlockStmt body, ReceiverParameter receiverParameter) {
this(null, modifiers, annotations, typeParameters, name, parameters, thrownExceptions, body, receiverParameter);
}

/**This constructor is used by the parser and is considered private.*/
@Generated("com.github.javaparser.generator.core.node.MainConstructorGenerator")
public ConstructorDeclaration(TokenRange tokenRange, EnumSet<Modifier> modifiers, NodeList<AnnotationExpr> annotations, NodeList<TypeParameter> typeParameters, SimpleName name, NodeList<Parameter> parameters, NodeList<ReferenceType> thrownExceptions, BlockStmt body) {
super(tokenRange, modifiers, annotations, typeParameters, name, parameters, thrownExceptions);
public ConstructorDeclaration(TokenRange tokenRange, EnumSet<Modifier> modifiers, NodeList<AnnotationExpr> annotations, NodeList<TypeParameter> typeParameters, SimpleName name, NodeList<Parameter> parameters, NodeList<ReferenceType> thrownExceptions, BlockStmt body, ReceiverParameter receiverParameter) {
super(tokenRange, modifiers, annotations, typeParameters, name, parameters, thrownExceptions, receiverParameter);
setBody(body);
customInitialization();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,35 +66,35 @@ public final class MethodDeclaration extends CallableDeclaration<MethodDeclarati
private Type type;

private BlockStmt body;

public MethodDeclaration() {
this(null, EnumSet.noneOf(Modifier.class), new NodeList<>(), new NodeList<>(), new ClassOrInterfaceType(), new SimpleName(), new NodeList<>(), new NodeList<>(), new BlockStmt());
this(null, EnumSet.noneOf(Modifier.class), new NodeList<>(), new NodeList<>(), new ClassOrInterfaceType(), new SimpleName(), new NodeList<>(), new NodeList<>(), new BlockStmt(), null);
}

public MethodDeclaration(final EnumSet<Modifier> modifiers, final Type type, final String name) {
this(null, modifiers, new NodeList<>(), new NodeList<>(), type, new SimpleName(name), new NodeList<>(), new NodeList<>(), new BlockStmt());
this(null, modifiers, new NodeList<>(), new NodeList<>(), type, new SimpleName(name), new NodeList<>(), new NodeList<>(), new BlockStmt(), null);
}

public MethodDeclaration(final EnumSet<Modifier> modifiers, final String name, final Type type, final NodeList<Parameter> parameters) {
this(null, modifiers, new NodeList<>(), new NodeList<>(), type, new SimpleName(name), parameters, new NodeList<>(), new BlockStmt());
this(null, modifiers, new NodeList<>(), new NodeList<>(), type, new SimpleName(name), parameters, new NodeList<>(), new BlockStmt(), null);
}

@AllFieldsConstructor
public MethodDeclaration(final EnumSet<Modifier> modifiers, final NodeList<AnnotationExpr> annotations, final NodeList<TypeParameter> typeParameters, final Type type, final SimpleName name, final NodeList<Parameter> parameters, final NodeList<ReferenceType> thrownExceptions, final BlockStmt body) {
this(null, modifiers, annotations, typeParameters, type, name, parameters, thrownExceptions, body);
this(null, modifiers, annotations, typeParameters, type, name, parameters, thrownExceptions, body, null);
}

/** @deprecated this constructor allows you to set "isDefault", but this is no longer a field of this node, but simply one of the modifiers. Use setDefault(boolean) or add DEFAULT to the modifiers set. */
@Deprecated
public MethodDeclaration(final EnumSet<Modifier> modifiers, final NodeList<AnnotationExpr> annotations, final NodeList<TypeParameter> typeParameters, final Type type, final SimpleName name, final boolean isDefault, final NodeList<Parameter> parameters, final NodeList<ReferenceType> thrownExceptions, final BlockStmt body) {
this(null, modifiers, annotations, typeParameters, type, name, parameters, thrownExceptions, body);
public MethodDeclaration(final EnumSet<Modifier> modifiers, final NodeList<AnnotationExpr> annotations, final NodeList<TypeParameter> typeParameters, final Type type, final SimpleName name, final boolean isDefault, final NodeList<Parameter> parameters, final NodeList<ReferenceType> thrownExceptions, final BlockStmt body, ReceiverParameter receiverParameter) {
this(null, modifiers, annotations, typeParameters, type, name, parameters, thrownExceptions, body, receiverParameter);
setDefault(isDefault);
}

/**This constructor is used by the parser and is considered private.*/
@Generated("com.github.javaparser.generator.core.node.MainConstructorGenerator")
public MethodDeclaration(TokenRange tokenRange, EnumSet<Modifier> modifiers, NodeList<AnnotationExpr> annotations, NodeList<TypeParameter> typeParameters, Type type, SimpleName name, NodeList<Parameter> parameters, NodeList<ReferenceType> thrownExceptions, BlockStmt body) {
super(tokenRange, modifiers, annotations, typeParameters, name, parameters, thrownExceptions);
public MethodDeclaration(TokenRange tokenRange, EnumSet<Modifier> modifiers, NodeList<AnnotationExpr> annotations, NodeList<TypeParameter> typeParameters, Type type, SimpleName name, NodeList<Parameter> parameters, NodeList<ReferenceType> thrownExceptions, BlockStmt body, ReceiverParameter receiverParameter) {
super(tokenRange, modifiers, annotations, typeParameters, name, parameters, thrownExceptions, receiverParameter);
setType(type);
setBody(body);
customInitialization();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@
* y) {...}</code>
*
* <br/>All annotations preceding the type will be set on this object, not on the type.
* JavaParser doesn't know if it they are applicable to the method or the type.
* JavaParser doesn't know if it they are applicable to the parameter or the type.
*
* @author Julio Vilmar Gesser
*/
Expand All @@ -69,7 +69,7 @@ public final class Parameter extends Node implements NodeWithType<Parameter, Typ
private NodeList<AnnotationExpr> annotations;

private SimpleName name;

public Parameter() {
this(null, EnumSet.noneOf(Modifier.class), new NodeList<>(), new ClassOrInterfaceType(), false, new NodeList<>(), new SimpleName());
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,176 @@
/*
* Copyright (C) 2007-2010 Júlio Vilmar Gesser.
* Copyright (C) 2011, 2013-2016 The JavaParser Team.
*
* This file is part of JavaParser.
*
* JavaParser can be used either under the terms of
* a) the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* b) the terms of the Apache License
*
* You should have received a copy of both licenses in LICENCE.LGPL and
* LICENCE.APACHE. Please refer to those files for details.
*
* JavaParser is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*/
package com.github.javaparser.ast.body;

import com.github.javaparser.TokenRange;
import com.github.javaparser.ast.AllFieldsConstructor;
import com.github.javaparser.ast.Modifier;
import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.NodeList;
import com.github.javaparser.ast.expr.AnnotationExpr;
import com.github.javaparser.ast.expr.Name;
import com.github.javaparser.ast.expr.SimpleName;
import com.github.javaparser.ast.nodeTypes.NodeWithAnnotations;
import com.github.javaparser.ast.nodeTypes.NodeWithName;
import com.github.javaparser.ast.nodeTypes.NodeWithSimpleName;
import com.github.javaparser.ast.nodeTypes.NodeWithType;
import com.github.javaparser.ast.nodeTypes.modifiers.NodeWithFinalModifier;
import com.github.javaparser.ast.observer.ObservableProperty;
import com.github.javaparser.ast.type.ClassOrInterfaceType;
import com.github.javaparser.ast.type.Type;
import com.github.javaparser.ast.visitor.CloneVisitor;
import com.github.javaparser.ast.visitor.GenericVisitor;
import com.github.javaparser.ast.visitor.VoidVisitor;
import com.github.javaparser.metamodel.JavaParserMetaModel;
import com.github.javaparser.metamodel.ParameterMetaModel;

import javax.annotation.Generated;
import java.util.EnumSet;

import static com.github.javaparser.utils.Utils.assertNotNull;

/**
* The rather obscure <a href="http://blog.joda.org/2015/12/explicit-receiver-parameters.html">"receiver parameter" feature of Java</a>.
*
* <br/>All annotations preceding the type will be set on this object, not on the type.
* JavaParser doesn't know if it they are applicable to the receiver parameter or the type.
*
* @author Julio Vilmar Gesser
*/
public final class ReceiverParameter extends Node implements NodeWithType<ReceiverParameter, Type>, NodeWithAnnotations<ReceiverParameter>, NodeWithName<ReceiverParameter> {

private Type type;

private NodeList<AnnotationExpr> annotations;

private Name name;

public ReceiverParameter() {
this(null, new NodeList<>(), new ClassOrInterfaceType(), new Name());
}

public ReceiverParameter(Type type, Name name) {
this(null, new NodeList<>(), type, name);
}

/**
* Creates a new {@link ReceiverParameter}.
*
* @param type type of the parameter
* @param name name of the parameter
*/
public ReceiverParameter(Type type, String name) {
this(null, new NodeList<>(), type, new Name(name));
}

@AllFieldsConstructor
public ReceiverParameter(NodeList<AnnotationExpr> annotations, Type type, Name name) {
this(null, annotations, type, name);
}

/**This constructor is used by the parser and is considered private.*/
@Generated("com.github.javaparser.generator.core.node.MainConstructorGenerator")
public ReceiverParameter(TokenRange tokenRange, NodeList<AnnotationExpr> annotations, Type type, Name name) {
super(tokenRange);
setAnnotations(annotations);
setType(type);
setName(name);
customInitialization();
}

@Override
public <R, A> R accept(GenericVisitor<R, A> v, A arg) {
return null;
}

@Override
public <A> void accept(VoidVisitor<A> v, A arg) {

}

@Generated("com.github.javaparser.generator.core.node.PropertyGenerator")
public Type getType() {
return type;
}

@Generated("com.github.javaparser.generator.core.node.PropertyGenerator")
public ReceiverParameter setType(final Type type) {
assertNotNull(type);
if (type == this.type) {
return (ReceiverParameter) this;
}
notifyPropertyChange(ObservableProperty.TYPE, this.type, type);
if (this.type != null)
this.type.setParentNode(null);
this.type = type;
setAsParentNodeOf(type);
return this;
}

/**
* @return the list returned could be immutable (in that case it will be empty)
*/
@Generated("com.github.javaparser.generator.core.node.PropertyGenerator")
public NodeList<AnnotationExpr> getAnnotations() {
return annotations;
}

/**
* @param annotations a null value is currently treated as an empty list. This behavior could change in the future,
* so please avoid passing null
*/
@Generated("com.github.javaparser.generator.core.node.PropertyGenerator")
public ReceiverParameter setAnnotations(final NodeList<AnnotationExpr> annotations) {
assertNotNull(annotations);
if (annotations == this.annotations) {
return (ReceiverParameter) this;
}
notifyPropertyChange(ObservableProperty.ANNOTATIONS, this.annotations, annotations);
if (this.annotations != null)
this.annotations.setParentNode(null);
this.annotations = annotations;
setAsParentNodeOf(annotations);
return this;
}

@Override
@Generated("com.github.javaparser.generator.core.node.CloneGenerator")
public ReceiverParameter clone() {
return (ReceiverParameter) accept(new CloneVisitor(), null);
}

@Override
@Generated("com.github.javaparser.generator.core.node.GetMetaModelGenerator")
public ParameterMetaModel getMetaModel() {
return JavaParserMetaModel.parameterMetaModel;
}

@Override
public Name getName() {
return name;
}

@Override
public ReceiverParameter setName(Name name) {
this.name=name;
return this;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ public Visitable visit(final ConstructorDeclaration n, final Object arg) {
NodeList<TypeParameter> typeParameters = cloneList(n.getTypeParameters(), arg);
NodeList<AnnotationExpr> annotations = cloneList(n.getAnnotations(), arg);
Comment comment = cloneNode(n.getComment(), arg);
ConstructorDeclaration r = new ConstructorDeclaration(n.getTokenRange().orElse(null), n.getModifiers(), annotations, typeParameters, name, parameters, thrownExceptions, body);
ConstructorDeclaration r = new ConstructorDeclaration(n.getTokenRange().orElse(null), n.getModifiers(), annotations, typeParameters, name, parameters, thrownExceptions, body, null);
r.setComment(comment);
return r;
}
Expand All @@ -205,7 +205,7 @@ public Visitable visit(final MethodDeclaration n, final Object arg) {
NodeList<TypeParameter> typeParameters = cloneList(n.getTypeParameters(), arg);
NodeList<AnnotationExpr> annotations = cloneList(n.getAnnotations(), arg);
Comment comment = cloneNode(n.getComment(), arg);
MethodDeclaration r = new MethodDeclaration(n.getTokenRange().orElse(null), n.getModifiers(), annotations, typeParameters, type, name, parameters, thrownExceptions, body);
MethodDeclaration r = new MethodDeclaration(n.getTokenRange().orElse(null), n.getModifiers(), annotations, typeParameters, type, name, parameters, thrownExceptions, body, null);
r.setComment(comment);
return r;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ protected CallableDeclarationMetaModel(Optional<BaseNodeMetaModel> superNodeMeta

public PropertyMetaModel parametersPropertyMetaModel;

public PropertyMetaModel receiverParameterPropertyMetaModel;

public PropertyMetaModel thrownExceptionsPropertyMetaModel;

public PropertyMetaModel typeParametersPropertyMetaModel;
Expand Down

0 comments on commit 2e435be

Please sign in to comment.