JvmDeclarationOrigin used in newMethod()

This commit is contained in:
Andrey Breslav
2014-05-27 19:15:07 +04:00
parent 87a8f52f70
commit 4e1ceb62b5
15 changed files with 47 additions and 55 deletions
@@ -19,7 +19,6 @@ package org.jetbrains.jet.codegen;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.org.objectweb.asm.*;
public abstract class AbstractClassBuilder implements ClassBuilder {
@@ -64,8 +63,7 @@ public abstract class AbstractClassBuilder implements ClassBuilder {
@Override
@NotNull
public MethodVisitor newMethod(
@Nullable PsiElement origin,
@Nullable DeclarationDescriptor descriptor,
@NotNull JvmDeclarationOrigin origin,
int access,
@NotNull String name,
@NotNull String desc,
@@ -19,7 +19,6 @@ package org.jetbrains.jet.codegen;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.org.objectweb.asm.AnnotationVisitor;
import org.jetbrains.org.objectweb.asm.ClassVisitor;
import org.jetbrains.org.objectweb.asm.FieldVisitor;
@@ -38,8 +37,7 @@ public interface ClassBuilder {
@NotNull
MethodVisitor newMethod(
@Nullable PsiElement origin,
@Nullable DeclarationDescriptor descriptor,
@NotNull JvmDeclarationOrigin origin,
int access,
@NotNull String name,
@NotNull String desc,
@@ -201,7 +201,7 @@ public class ClosureCodegen extends ParentCodegenAware {
private void generateConstInstance(@NotNull ClassBuilder cv) {
MethodVisitor mv = cv.newMethod(fun, funDescriptor, ACC_STATIC | ACC_SYNTHETIC, "<clinit>", "()V", null, ArrayUtil.EMPTY_STRING_ARRAY);
MethodVisitor mv = cv.newMethod(OtherOrigin(fun, funDescriptor), ACC_STATIC | ACC_SYNTHETIC, "<clinit>", "()V", null, ArrayUtil.EMPTY_STRING_ARRAY);
InstructionAdapter iv = new InstructionAdapter(mv);
cv.newField(OtherOrigin(fun, funDescriptor), ACC_STATIC | ACC_FINAL, JvmAbi.INSTANCE_FIELD, asmType.getDescriptor(), null, null);
@@ -221,7 +221,7 @@ public class ClosureCodegen extends ParentCodegenAware {
if (bridge.equals(delegate)) return;
MethodVisitor mv =
cv.newMethod(fun, funDescriptor, ACC_PUBLIC | ACC_BRIDGE, bridge.getName(), bridge.getDescriptor(), null, ArrayUtil.EMPTY_STRING_ARRAY);
cv.newMethod(OtherOrigin(fun, funDescriptor), ACC_PUBLIC | ACC_BRIDGE, bridge.getName(), bridge.getDescriptor(), null, ArrayUtil.EMPTY_STRING_ARRAY);
if (state.getClassBuilderMode() != ClassBuilderMode.FULL) return;
@@ -258,7 +258,7 @@ public class ClosureCodegen extends ParentCodegenAware {
Type[] argTypes = fieldListToTypeArray(args);
Method constructor = new Method("<init>", Type.VOID_TYPE, argTypes);
MethodVisitor mv = cv.newMethod(fun, funDescriptor, visibilityFlag, "<init>", constructor.getDescriptor(), null,
MethodVisitor mv = cv.newMethod(OtherOrigin(fun, funDescriptor), visibilityFlag, "<init>", constructor.getDescriptor(), null,
ArrayUtil.EMPTY_STRING_ARRAY);
if (state.getClassBuilderMode() == ClassBuilderMode.FULL) {
mv.visitCode();
@@ -19,7 +19,6 @@ package org.jetbrains.jet.codegen;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.org.objectweb.asm.AnnotationVisitor;
import org.jetbrains.org.objectweb.asm.ClassVisitor;
import org.jetbrains.org.objectweb.asm.FieldVisitor;
@@ -45,15 +44,14 @@ public abstract class DelegatingClassBuilder implements ClassBuilder {
@NotNull
@Override
public MethodVisitor newMethod(
@Nullable PsiElement origin,
@Nullable DeclarationDescriptor descriptor,
@NotNull JvmDeclarationOrigin origin,
int access,
@NotNull String name,
@NotNull String desc,
@Nullable String signature,
@Nullable String[] exceptions
) {
return getDelegate().newMethod(origin, descriptor, access, name, desc, signature, exceptions);
return getDelegate().newMethod(origin, access, name, desc, signature, exceptions);
}
@NotNull
@@ -63,6 +63,7 @@ import java.util.List;
import java.util.Set;
import static org.jetbrains.jet.codegen.AsmUtil.*;
import static org.jetbrains.jet.codegen.CodegenPackage.OtherOrigin;
import static org.jetbrains.jet.codegen.JvmSerializationBindings.*;
import static org.jetbrains.jet.codegen.binding.CodegenBinding.isLocalNamedFun;
import static org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor.Kind.DECLARATION;
@@ -126,8 +127,7 @@ public class FunctionCodegen extends ParentCodegenAware {
OwnerKind methodContextKind = methodContext.getContextKind();
Method asmMethod = jvmSignature.getAsmMethod();
MethodVisitor mv = v.newMethod(origin,
functionDescriptor,
MethodVisitor mv = v.newMethod(OtherOrigin(origin, functionDescriptor),
getMethodAsmFlags(functionDescriptor, methodContextKind),
asmMethod.getName(),
asmMethod.getDescriptor(),
@@ -507,7 +507,7 @@ public class FunctionCodegen extends ParentCodegenAware {
return;
}
int flags = getVisibilityAccessFlag(constructorDescriptor);
MethodVisitor mv = classBuilder.newMethod(null, constructorDescriptor, flags, "<init>", "()V", null,
MethodVisitor mv = classBuilder.newMethod(OtherOrigin(constructorDescriptor), flags, "<init>", "()V", null,
getThrownExceptions(constructorDescriptor, state.getTypeMapper()));
if (state.getClassBuilderMode() == ClassBuilderMode.LIGHT_CLASSES) return;
@@ -559,7 +559,7 @@ public class FunctionCodegen extends ParentCodegenAware {
Method defaultMethod = typeMapper.mapDefaultMethod(functionDescriptor, kind, owner);
MethodVisitor mv = v.newMethod(null, functionDescriptor, flags | (isConstructor ? 0 : ACC_STATIC),
MethodVisitor mv = v.newMethod(OtherOrigin(functionDescriptor), flags | (isConstructor ? 0 : ACC_STATIC),
defaultMethod.getName(),
defaultMethod.getDescriptor(), null,
getThrownExceptions(functionDescriptor, typeMapper));
@@ -729,7 +729,7 @@ public class FunctionCodegen extends ParentCodegenAware {
) {
int flags = ACC_PUBLIC | ACC_BRIDGE | ACC_SYNTHETIC; // TODO.
MethodVisitor mv = v.newMethod(null, descriptor, flags, delegateTo.getName(), bridge.getDescriptor(), null, null);
MethodVisitor mv = v.newMethod(OtherOrigin(descriptor), flags, delegateTo.getName(), bridge.getDescriptor(), null, null);
if (state.getClassBuilderMode() != ClassBuilderMode.FULL) return;
mv.visitCode();
@@ -772,7 +772,7 @@ public class FunctionCodegen extends ParentCodegenAware {
int flags = ACC_PUBLIC;
MethodVisitor mv = v.newMethod(null, functionDescriptor, flags, delegateMethod.getName(), delegateMethod.getDescriptor(), null,
MethodVisitor mv = v.newMethod(OtherOrigin(functionDescriptor), flags, delegateMethod.getName(), delegateMethod.getDescriptor(), null,
getThrownExceptions(functionDescriptor, typeMapper));
if (state.getClassBuilderMode() != ClassBuilderMode.FULL) return;
@@ -68,6 +68,7 @@ import java.util.*;
import static org.jetbrains.jet.codegen.AsmUtil.*;
import static org.jetbrains.jet.codegen.CodegenPackage.OtherOrigin;
import static org.jetbrains.jet.codegen.JvmCodegenUtil.*;
import static org.jetbrains.jet.codegen.JvmDeclarationOrigin.NO_ORIGIN;
import static org.jetbrains.jet.codegen.binding.CodegenBinding.*;
import static org.jetbrains.jet.descriptors.serialization.NameSerializationUtil.createNameResolver;
import static org.jetbrains.jet.lang.resolve.BindingContextUtils.descriptorToDeclaration;
@@ -493,7 +494,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
ACC_PUBLIC | ACC_ABSTRACT :
ACC_PUBLIC;
if (JvmCodegenUtil.getDeclaredFunctionByRawSignature(descriptor, Name.identifier("toArray"), builtIns.getArray()) == null) {
MethodVisitor mv = v.newMethod(null, null, access, "toArray", "()[Ljava/lang/Object;", null, null);
MethodVisitor mv = v.newMethod(NO_ORIGIN, access, "toArray", "()[Ljava/lang/Object;", null, null);
if (descriptor.getKind() != ClassKind.TRAIT) {
InstructionAdapter iv = new InstructionAdapter(mv);
@@ -508,7 +509,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
}
if (!isGenericToArrayPresent()) {
MethodVisitor mv = v.newMethod(null, null, access, "toArray", "([Ljava/lang/Object;)[Ljava/lang/Object;", null, null);
MethodVisitor mv = v.newMethod(NO_ORIGIN, access, "toArray", "([Ljava/lang/Object;)[Ljava/lang/Object;", null, null);
if (descriptor.getKind() != ClassKind.TRAIT) {
InstructionAdapter iv = new InstructionAdapter(mv);
@@ -536,7 +537,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
int access = descriptor.getKind() == ClassKind.TRAIT ?
ACC_PUBLIC | ACC_ABSTRACT :
ACC_PUBLIC;
MethodVisitor mv = v.newMethod(null, null, access, name, desc, null, null);
MethodVisitor mv = v.newMethod(NO_ORIGIN, access, name, desc, null, null);
if (descriptor.getKind() != ClassKind.TRAIT) {
mv.visitCode();
genThrow(mv, "java/lang/UnsupportedOperationException", "Mutating immutable collection");
@@ -620,7 +621,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
KotlinBuiltIns.getInstance().getBoolean(),
KotlinBuiltIns.getInstance().getAny()
);
MethodVisitor mv = v.newMethod(null, equalsFunction, ACC_PUBLIC, "equals", "(Ljava/lang/Object;)Z", null, null);
MethodVisitor mv = v.newMethod(OtherOrigin(equalsFunction), ACC_PUBLIC, "equals", "(Ljava/lang/Object;)Z", null, null);
InstructionAdapter iv = new InstructionAdapter(mv);
mv.visitCode();
@@ -679,7 +680,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
descriptor, Name.identifier(CodegenUtil.HASH_CODE_METHOD_NAME),
KotlinBuiltIns.getInstance().getInt()
);
MethodVisitor mv = v.newMethod(null, hashCodeFunction, ACC_PUBLIC, "hashCode", "()I", null, null);
MethodVisitor mv = v.newMethod(OtherOrigin(hashCodeFunction), ACC_PUBLIC, "hashCode", "()I", null, null);
InstructionAdapter iv = new InstructionAdapter(mv);
mv.visitCode();
@@ -730,7 +731,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
descriptor, Name.identifier(CodegenUtil.TO_STRING_METHOD_NAME),
KotlinBuiltIns.getInstance().getString()
);
MethodVisitor mv = v.newMethod(null, toString, ACC_PUBLIC, "toString", "()Ljava/lang/String;", null, null);
MethodVisitor mv = v.newMethod(OtherOrigin(toString), ACC_PUBLIC, "toString", "()Ljava/lang/String;", null, null);
InstructionAdapter iv = new InstructionAdapter(mv);
mv.visitCode();
@@ -887,7 +888,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
return DescriptorUtils.isEnumValuesMethod(descriptor);
}
});
MethodVisitor mv = v.newMethod(myClass, valuesFunction, ACC_PUBLIC | ACC_STATIC, "values", "()" + type.getDescriptor(), null, null);
MethodVisitor mv = v.newMethod(OtherOrigin(myClass, valuesFunction), ACC_PUBLIC | ACC_STATIC, "values", "()" + type.getDescriptor(), null, null);
if (state.getClassBuilderMode() != ClassBuilderMode.FULL) return;
mv.visitCode();
@@ -905,7 +906,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
return DescriptorUtils.isEnumValueOfMethod(descriptor);
}
});
MethodVisitor mv = v.newMethod(myClass, valueOfFunction,
MethodVisitor mv = v.newMethod(OtherOrigin(myClass, valueOfFunction),
ACC_PUBLIC | ACC_STATIC, "valueOf", "(Ljava/lang/String;)" + classAsmType.getDescriptor(), null, null);
if (state.getClassBuilderMode() != ClassBuilderMode.FULL) return;
@@ -35,8 +35,11 @@ public class JvmDeclarationOrigin(
}
}
public fun OtherOrigin(element: PsiElement, descriptor: DeclarationDescriptor): JvmDeclarationOrigin = JvmDeclarationOrigin(JvmDeclarationOriginKind.OTHER, element, descriptor)
public fun OtherOrigin(element: PsiElement?, descriptor: DeclarationDescriptor?): JvmDeclarationOrigin =
if (element == null && descriptor == null)
JvmDeclarationOrigin.NO_ORIGIN
else JvmDeclarationOrigin(JvmDeclarationOriginKind.OTHER, element, descriptor)
public fun OtherOrigin(element: PsiElement): JvmDeclarationOrigin = JvmDeclarationOrigin(JvmDeclarationOriginKind.OTHER, element, null)
public fun OtherOrigin(element: PsiElement?): JvmDeclarationOrigin = OtherOrigin(element, null)
public fun OtherOrigin(descriptor: DeclarationDescriptor): JvmDeclarationOrigin = JvmDeclarationOrigin(JvmDeclarationOriginKind.OTHER, null, descriptor)
public fun OtherOrigin(descriptor: DeclarationDescriptor?): JvmDeclarationOrigin = OtherOrigin(null, descriptor)
@@ -50,6 +50,7 @@ import java.util.List;
import static org.jetbrains.jet.codegen.AsmUtil.boxType;
import static org.jetbrains.jet.codegen.AsmUtil.isPrimitive;
import static org.jetbrains.jet.codegen.CodegenPackage.OtherOrigin;
import static org.jetbrains.jet.codegen.JvmDeclarationOrigin.NO_ORIGIN;
import static org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor.Kind.SYNTHESIZED;
import static org.jetbrains.jet.lang.resolve.BindingContext.VARIABLE;
@@ -200,7 +201,7 @@ public abstract class MemberCodegen<T extends JetElement/* TODO: & JetDeclaratio
assert state.getClassBuilderMode() == ClassBuilderMode.FULL
: "<clinit> should not be generated for light classes. Descriptor: " + descriptor;
if (clInit == null) {
MethodVisitor mv = v.newMethod(null, descriptor, ACC_STATIC, "<clinit>", "()V", null, null);
MethodVisitor mv = v.newMethod(OtherOrigin(descriptor), ACC_STATIC, "<clinit>", "()V", null, null);
mv.visitCode();
SimpleFunctionDescriptorImpl clInit =
SimpleFunctionDescriptorImpl.create(descriptor, Annotations.EMPTY, Name.special("<clinit>"), SYNTHESIZED);
@@ -130,7 +130,7 @@ public class PropertyCodegen {
Type type = typeMapper.mapType(descriptor);
String name = p.getName();
assert name != null : "Annotation parameter has no name: " + p.getText();
MethodVisitor visitor = v.newMethod(p, descriptor, ACC_PUBLIC | ACC_ABSTRACT, name, "()" + type.getDescriptor(), null, null);
MethodVisitor visitor = v.newMethod(OtherOrigin(p, descriptor), ACC_PUBLIC | ACC_ABSTRACT, name, "()" + type.getDescriptor(), null, null);
JetExpression defaultValue = p.getDefaultValue();
if (defaultValue != null) {
CompileTimeConstant<?> constant = ExpressionCodegen.getCompileTimeConstant(defaultValue, bindingContext);
@@ -171,7 +171,7 @@ public class PropertyCodegen {
if (!isTrait(context.getContextDescriptor()) || kind == OwnerKind.TRAIT_IMPL) {
int flags = ACC_DEPRECATED | ACC_FINAL | ACC_PRIVATE | ACC_STATIC | ACC_SYNTHETIC;
MethodVisitor mv = v.newMethod(null, descriptor, flags, name, desc, null, null);
MethodVisitor mv = v.newMethod(OtherOrigin(descriptor), flags, name, desc, null, null);
AnnotationCodegen.forMethod(mv, typeMapper).genAnnotations(descriptor);
mv.visitCode();
mv.visitInsn(Opcodes.RETURN);
@@ -95,7 +95,7 @@ public class SamWrapperCodegen {
}
private void generateConstructor(Type ownerType, Type functionType, ClassBuilder cv) {
MethodVisitor mv = cv.newMethod(null, samType.getJavaClassDescriptor(),
MethodVisitor mv = cv.newMethod(OtherOrigin(samType.getJavaClassDescriptor()),
NO_FLAG_PACKAGE_PRIVATE, "<init>", Type.getMethodDescriptor(Type.VOID_TYPE, functionType), null, null);
if (state.getClassBuilderMode() == ClassBuilderMode.FULL) {
@@ -129,7 +129,7 @@ public class ScriptCodegen extends MemberCodegen<JetScript> {
JvmMethodSignature jvmSignature = typeMapper.mapScriptSignature(scriptDescriptor, context.getEarlierScripts());
MethodVisitor mv = classBuilder.newMethod(
scriptDeclaration, scriptDescriptor.getClassDescriptor().getUnsubstitutedPrimaryConstructor(),
OtherOrigin(scriptDeclaration, scriptDescriptor.getClassDescriptor().getUnsubstitutedPrimaryConstructor()),
ACC_PUBLIC, jvmSignature.getAsmMethod().getName(), jvmSignature.getAsmMethod().getDescriptor(),
null, null);
@@ -65,9 +65,9 @@ public abstract class SignatureCollectingClassBuilderFactory(
return super.newField(origin, access, name, desc, signature, value)
}
override fun newMethod(origin: PsiElement?, descriptor: DeclarationDescriptor?, access: Int, name: String, desc: String, signature: String?, exceptions: Array<out String>?): MethodVisitor {
signatures.putValue(RawSignature(name, desc, MemberKind.METHOD), JvmDeclarationOrigin(JvmDeclarationOriginKind.OTHER, origin, descriptor))
return super.newMethod(origin, descriptor, access, name, desc, signature, exceptions)
override fun newMethod(origin: JvmDeclarationOrigin, access: Int, name: String, desc: String, signature: String?, exceptions: Array<out String>?): MethodVisitor {
signatures.putValue(RawSignature(name, desc, MemberKind.METHOD), origin)
return super.newMethod(origin, access, name, desc, signature, exceptions)
}
override fun done() {
@@ -21,10 +21,7 @@ import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.ArrayUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.OutputFile;
import org.jetbrains.jet.codegen.AsmUtil;
import org.jetbrains.jet.codegen.ClassBuilder;
import org.jetbrains.jet.codegen.FieldInfo;
import org.jetbrains.jet.codegen.StackValue;
import org.jetbrains.jet.codegen.*;
import org.jetbrains.jet.codegen.state.GenerationState;
import org.jetbrains.jet.codegen.state.JetTypeMapper;
import org.jetbrains.org.objectweb.asm.*;
@@ -37,6 +34,8 @@ import org.jetbrains.org.objectweb.asm.tree.VarInsnNode;
import java.io.IOException;
import java.util.*;
import static org.jetbrains.jet.codegen.JvmDeclarationOrigin.NO_ORIGIN;
public class AnonymousObjectTransformer {
protected final GenerationState state;
@@ -232,7 +231,7 @@ public class AnonymousObjectTransformer {
String constructorDescriptor = Type.getMethodDescriptor(Type.VOID_TYPE, descTypes.toArray(new Type[descTypes.size()]));
MethodVisitor constructorVisitor = classBuilder.newMethod(null, null,
MethodVisitor constructorVisitor = classBuilder.newMethod(NO_ORIGIN,
AsmUtil.NO_FLAG_PACKAGE_PRIVATE,
"<init>", constructorDescriptor,
null, ArrayUtil.EMPTY_STRING_ARRAY);
@@ -304,8 +303,7 @@ public class AnonymousObjectTransformer {
@NotNull
private static MethodVisitor newMethod(@NotNull ClassBuilder builder, @NotNull MethodNode original) {
return builder.newMethod(
null,
null,
NO_ORIGIN,
original.access,
original.name,
original.desc,
@@ -16,13 +16,11 @@
package org.jetbrains.jet.codegen.inline;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.codegen.ClassBuilder;
import org.jetbrains.jet.codegen.DelegatingClassBuilder;
import org.jetbrains.jet.codegen.JvmDeclarationOrigin;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.org.objectweb.asm.AnnotationVisitor;
import org.jetbrains.org.objectweb.asm.ClassVisitor;
import org.jetbrains.org.objectweb.asm.FieldVisitor;
@@ -60,8 +58,7 @@ public class RemappingClassBuilder extends DelegatingClassBuilder {
@Override
@NotNull
public MethodVisitor newMethod(
@Nullable PsiElement origin,
@Nullable DeclarationDescriptor descriptor,
@NotNull JvmDeclarationOrigin origin,
int access,
@NotNull String name,
@NotNull String desc,
@@ -69,7 +66,7 @@ public class RemappingClassBuilder extends DelegatingClassBuilder {
@Nullable String[] exceptions
) {
return new RemappingMethodAdapter(access, desc,
builder.newMethod(origin, descriptor, access, name, remapper.mapMethodDesc(desc), signature, exceptions),
builder.newMethod(origin, access, name, remapper.mapMethodDesc(desc), signature, exceptions),
remapper);
}
@@ -25,7 +25,6 @@ import com.intellij.util.containers.Stack;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.codegen.JvmDeclarationOrigin;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.org.objectweb.asm.ClassVisitor;
import org.jetbrains.org.objectweb.asm.FieldVisitor;
import org.jetbrains.org.objectweb.asm.MethodVisitor;
@@ -99,19 +98,18 @@ public class StubClassBuilder extends AbstractClassBuilder {
@NotNull
@Override
public MethodVisitor newMethod(
@Nullable PsiElement origin,
@Nullable DeclarationDescriptor descriptor,
@NotNull JvmDeclarationOrigin origin,
int access,
@NotNull String name,
@NotNull String desc,
@Nullable String signature,
@Nullable String[] exceptions
) {
MethodVisitor internalVisitor = super.newMethod(origin, descriptor, access, name, desc, signature, exceptions);
MethodVisitor internalVisitor = super.newMethod(origin, access, name, desc, signature, exceptions);
if (internalVisitor != EMPTY_METHOD_VISITOR) {
// If stub for method generated
markLastChild(origin);
markLastChild(origin.getElement());
}
return internalVisitor;