Skip to content

Commit

Permalink
Merge pull request #166 from ZenCodeLang/feature/refactor-changes-in-…
Browse files Browse the repository at this point in the history
…tests-2

Feature/refactor changes in tests 2
  • Loading branch information
stanhebben authored Aug 16, 2024
2 parents 1eaedca + e933c7c commit 4101ccf
Show file tree
Hide file tree
Showing 326 changed files with 2,226 additions and 1,925 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,20 @@
import org.openzen.zenscript.codemodel.compilation.*;
import org.openzen.zenscript.codemodel.expression.CallArguments;
import org.openzen.zenscript.codemodel.expression.Expression;
import org.openzen.zenscript.codemodel.identifiers.TypeSymbol;
import org.openzen.zenscript.codemodel.identifiers.instances.MethodInstance;
import org.openzen.zenscript.codemodel.type.DefinitionTypeID;
import org.openzen.zenscript.codemodel.type.TypeID;

import java.util.Optional;

public class LocalTypeImpl implements LocalType {
private final TypeID thisType;
private final ResolvedType resolvedThis;
private ResolvedType resolvedSuper;
private final TypeResolver resolver;
private ResolvedType resolvedThis;

public LocalTypeImpl(TypeID type, TypeResolver resolver) {
thisType = type;
resolvedThis = resolver.resolve(thisType);
this.resolver = resolver;
}

@Override
Expand All @@ -34,6 +33,9 @@ public Optional<TypeID> getSuperType() {

@Override
public StaticCallable thisCall() {
if (resolvedThis == null) {
resolvedThis = resolver.resolve(thisType);
}
return resolvedThis.getConstructor().map(constructor -> new ThisCallable(thisType, constructor));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,10 @@ public void setBody(Statement body) {
this.body = body;

if (type == BasicTypeID.UNDETERMINED) {
TypeID returnType = body.getReturnType();
if (returnType != null) {
body.getReturnType().ifPresent(returnType -> {
this.type = returnType;
this.header = new FunctionHeader(type);
}
});
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,7 @@
import org.openzen.zenscript.codemodel.GenericMapper;
import org.openzen.zenscript.codemodel.HighLevelDefinition;
import org.openzen.zenscript.codemodel.Modifiers;
import org.openzen.zenscript.codemodel.compilation.AnyMethod;
import org.openzen.zenscript.codemodel.compilation.CompileErrors;
import org.openzen.zenscript.codemodel.compilation.ExpressionBuilder;
import org.openzen.zenscript.codemodel.compilation.InstanceCallableMethod;
import org.openzen.zenscript.codemodel.expression.CallArguments;
import org.openzen.zenscript.codemodel.expression.Expression;
import org.openzen.zenscript.codemodel.identifiers.MethodID;
import org.openzen.zenscript.codemodel.identifiers.instances.MethodInstance;
import org.openzen.zenscript.codemodel.member.ref.DefinitionMemberRef;
import org.openzen.zenscript.codemodel.member.ref.ImplementationMemberInstance;
import org.openzen.zenscript.codemodel.type.TypeID;
Expand All @@ -23,7 +16,6 @@
public class ImplementationMember extends DefinitionMember {
public final TypeID type;
public final List<IDefinitionMember> members = new ArrayList<>();
public final Map<DefinitionMemberRef, IDefinitionMember> definitionBorrowedMembers = new HashMap<>(); // contains members from the outer definition to implement interface members

public ImplementationMember(CodePosition position, HighLevelDefinition definition, Modifiers modifiers, TypeID type) {
super(position, definition, modifiers);
Expand All @@ -44,7 +36,7 @@ public String describe() {
public void registerTo(TypeID targetType, MemberSet.Builder members, GenericMapper mapper) {
TypeID implementsType = mapper.map(type);
FunctionHeader header = new FunctionHeader(implementsType);
ImplementationMemberInstance implementationInstance = new ImplementationMemberInstance(this, targetType, implementsType);
ImplementationMemberInstance implementationInstance = new ImplementationMemberInstance(implementsType);
members.method(MethodID.caster(type), new InterfaceCaster(header, implementationInstance));

for (IDefinitionMember member : this.members) {
Expand Down Expand Up @@ -82,39 +74,4 @@ public boolean isAbstract() {
public FunctionHeader getHeader() {
return null;
}

private static class InterfaceCaster implements InstanceCallableMethod {
private final FunctionHeader header;
private final ImplementationMemberInstance implementationInstance;

public InterfaceCaster(FunctionHeader header, ImplementationMemberInstance implementationInstance) {
this.header = header;
this.implementationInstance = implementationInstance;
}

@Override
public FunctionHeader getHeader() {
return header;
}

@Override
public Optional<MethodInstance> asMethod() {
return Optional.empty();
}

@Override
public AnyMethod withGenericArguments(GenericMapper mapper) {
return new InterfaceCaster(header.withGenericArguments(mapper), implementationInstance);
}

@Override
public Modifiers getModifiers() {
return Modifiers.IMPLICIT;
}

@Override
public Expression call(ExpressionBuilder builder, Expression instance, CallArguments arguments) {
return builder.interfaceCast(implementationInstance, instance);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package org.openzen.zenscript.codemodel.member;

import org.openzen.zenscript.codemodel.FunctionHeader;
import org.openzen.zenscript.codemodel.GenericMapper;
import org.openzen.zenscript.codemodel.Modifiers;
import org.openzen.zenscript.codemodel.compilation.AnyMethod;
import org.openzen.zenscript.codemodel.compilation.ExpressionBuilder;
import org.openzen.zenscript.codemodel.compilation.InstanceCallableMethod;
import org.openzen.zenscript.codemodel.expression.CallArguments;
import org.openzen.zenscript.codemodel.expression.Expression;
import org.openzen.zenscript.codemodel.identifiers.instances.MethodInstance;
import org.openzen.zenscript.codemodel.member.ref.ImplementationMemberInstance;

import java.util.Optional;

public class InterfaceCaster implements InstanceCallableMethod {
private final FunctionHeader header;
private final ImplementationMemberInstance implementationInstance;

public InterfaceCaster(FunctionHeader header, ImplementationMemberInstance implementationInstance) {
this.header = header;
this.implementationInstance = implementationInstance;
}

@Override
public FunctionHeader getHeader() {
return header;
}

@Override
public Optional<MethodInstance> asMethod() {
return Optional.empty();
}

@Override
public AnyMethod withGenericArguments(GenericMapper mapper) {
return new InterfaceCaster(header.withGenericArguments(mapper), implementationInstance);
}

@Override
public Modifiers getModifiers() {
return Modifiers.IMPLICIT;
}

@Override
public Expression call(ExpressionBuilder builder, Expression instance, CallArguments arguments) {
return builder.interfaceCast(implementationInstance, instance);
}
}
Original file line number Diff line number Diff line change
@@ -1,61 +1,11 @@
package org.openzen.zenscript.codemodel.member.ref;

import org.openzen.zencode.shared.CodePosition;
import org.openzen.zencode.shared.Tag;
import org.openzen.zenscript.codemodel.FunctionHeader;
import org.openzen.zenscript.codemodel.annotations.MemberAnnotation;
import org.openzen.zenscript.codemodel.member.IDefinitionMember;
import org.openzen.zenscript.codemodel.member.ImplementationMember;
import org.openzen.zenscript.codemodel.type.TypeID;

public class ImplementationMemberInstance {
public final ImplementationMember member;
public final TypeID implementsType;
private final TypeID type;

public ImplementationMemberInstance(ImplementationMember member, TypeID owner, TypeID implementsType) {
this.member = member;
this.type = owner;
public ImplementationMemberInstance(TypeID implementsType) {
this.implementsType = implementsType;
}

/* @Override
public CodePosition getPosition() {
return member.position;
}
@Override
public TypeID getOwnerType() {
return type;
}
@Override
public String describe() {
return member.describe();
}
@Override
public <T extends Tag> T getTag(Class<T> type) {
return member.getTag(type);
}
@Override
public DefinitionMemberRef getOverrides() {
return null;
}
@Override
public FunctionHeader getHeader() {
return null;
}
@Override
public MemberAnnotation[] getAnnotations() {
return member.annotations;
}
@Override
public IDefinitionMember getTarget() {
return member;
}*/
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.stream.Collectors;

Expand Down Expand Up @@ -72,17 +73,18 @@ public Statement transform(ExpressionTransformer transformer, ConcatMap<LoopStat
}

@Override
public TypeID getReturnType() {
public Optional<TypeID> getReturnType() {
final List<TypeID> collect = Arrays.stream(statements)
.map(Statement::getReturnType)
.filter(Objects::nonNull)
.filter(Optional::isPresent)
.map(Optional::get)
.distinct()
.collect(Collectors.toList());

if (collect.isEmpty())
return super.getReturnType();
else if (collect.size() == 1)
return collect.get(0);
return Optional.ofNullable(collect.get(0));
else
//TODO make this real?
throw new IllegalStateException("More than one possible type: " + collect.size());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import org.openzen.zenscript.codemodel.expression.ExpressionTransformer;
import org.openzen.zenscript.codemodel.type.TypeID;

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

public class DoWhileStatement extends LoopStatement {
Expand Down Expand Up @@ -56,7 +57,7 @@ public Statement transform(ExpressionTransformer transformer,ConcatMap<LoopState
}

@Override
public TypeID getReturnType() {
public Optional<TypeID> getReturnType() {
return content.getReturnType();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import org.openzen.zenscript.codemodel.identifiers.instances.IteratorInstance;
import org.openzen.zenscript.codemodel.type.TypeID;

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

public class ForeachStatement extends LoopStatement {
Expand Down Expand Up @@ -65,7 +66,7 @@ public Statement transform(ExpressionTransformer transformer, ConcatMap<LoopStat
}

@Override
public TypeID getReturnType() {
public Optional<TypeID> getReturnType() {
return content.getReturnType();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import org.openzen.zenscript.codemodel.expression.ExpressionTransformer;
import org.openzen.zenscript.codemodel.type.TypeID;

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

public class IfStatement extends Statement {
Expand Down Expand Up @@ -63,16 +64,17 @@ public Statement transform(ExpressionTransformer transformer, ConcatMap<LoopStat
}

@Override
public TypeID getReturnType() {
final TypeID thenType = onThen.getReturnType();
if (onElse == null)
return thenType;
final TypeID elseType = onElse.getReturnType();
if (thenType == elseType)
public Optional<TypeID> getReturnType() {
final Optional<TypeID> thenType = onThen.getReturnType();

if (onElse == null) {
return thenType;
}

if (thenType == null)
return elseType;
return thenType;
final Optional<TypeID> elseType = onElse.getReturnType();
if (thenType.equals(elseType)) {
return thenType;
}
return thenType.isPresent() ? thenType : elseType;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import org.openzen.zenscript.codemodel.type.BasicTypeID;
import org.openzen.zenscript.codemodel.type.TypeID;

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

public class ReturnStatement extends Statement {
Expand All @@ -19,8 +20,8 @@ public ReturnStatement(CodePosition position, Expression value) {
}

@Override
public TypeID getReturnType() {
return value != null ? value.type : BasicTypeID.VOID;
public Optional<TypeID> getReturnType() {
return Optional.of(value != null ? value.type : BasicTypeID.VOID);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import org.openzen.zenscript.codemodel.type.BasicTypeID;
import org.openzen.zenscript.codemodel.type.TypeID;

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

public abstract class Statement extends Taggable {
Expand All @@ -20,8 +21,8 @@ public Statement(CodePosition position, TypeID thrownType) {
this.thrownType = thrownType;
}

public TypeID getReturnType() {
return BasicTypeID.VOID;
public Optional<TypeID> getReturnType() {
return Optional.empty();
}

public TypeID getThrownType() {
Expand Down
Loading

0 comments on commit 4101ccf

Please sign in to comment.