From 6365e994d2338de58a3893bbf40f034fd8b3e59d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krau=C3=9F=2C=20Josefine?= Date: Thu, 27 Jun 2024 09:30:31 +0200 Subject: [PATCH] fixed another localvaridentifier that just isnt local actually --- src/main/java/Input.java | 4 +++- .../abstractSyntaxTree/Expression/LocalVarIdentifier.java | 7 +++++++ .../StatementExpression/MethodCallStatementExpression.java | 3 +-- .../StatementExpression/ReceivingMethod.java | 6 ++++++ 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/main/java/Input.java b/src/main/java/Input.java index a4d7c3a..33979f2 100644 --- a/src/main/java/Input.java +++ b/src/main/java/Input.java @@ -1,9 +1,11 @@ class Example1 { + int instVar; Example e; public Example1(){} int meth(int n){ Example e = new Example(); - int i = m1(2).m2().m3(); + instVar = 2; + int i = m1(instVar).m2().m3(); return 0; } diff --git a/src/main/java/abstractSyntaxTree/Expression/LocalVarIdentifier.java b/src/main/java/abstractSyntaxTree/Expression/LocalVarIdentifier.java index aa8345e..3b622e6 100644 --- a/src/main/java/abstractSyntaxTree/Expression/LocalVarIdentifier.java +++ b/src/main/java/abstractSyntaxTree/Expression/LocalVarIdentifier.java @@ -17,6 +17,7 @@ import java.util.Objects; public class LocalVarIdentifier extends AbstractType implements IExpression{ String identifier; + public String thisClass; public LocalVarIdentifier(String identifier){ this.identifier = identifier; } @@ -31,6 +32,12 @@ public class LocalVarIdentifier extends AbstractType implements IExpression{ if (localVars.containsKey(identifier)) { result.type = localVars.get(identifier); } else { + // check if instvar + result.type = typeContext.get(thisClass).get(identifier); + if(result.type != null){ + setTypeCheckResult(result); + return result; + } throw new TypeCheckException("Local var " + identifier + " does not exist."); } setTypeCheckResult(result); diff --git a/src/main/java/abstractSyntaxTree/StatementExpression/MethodCallStatementExpression.java b/src/main/java/abstractSyntaxTree/StatementExpression/MethodCallStatementExpression.java index 3eab51f..f34de98 100644 --- a/src/main/java/abstractSyntaxTree/StatementExpression/MethodCallStatementExpression.java +++ b/src/main/java/abstractSyntaxTree/StatementExpression/MethodCallStatementExpression.java @@ -67,9 +67,8 @@ public class MethodCallStatementExpression extends AbstractType implements IExpr currentType = (String) methodContext.get(currentType).get(receivingMethods.get(i).methodName).keySet().toArray()[0]; if(currentType == null) throw new TypeCheckException("The method " + methodName + " was not found in "+ classToSearchMethodIn + "."); + receivingMethods.get(i).thisClass = this.thisClass; receivingMethods.get(i).checkParameters(methodContext, typeContext, localVars); - System.out.println(currentType); - } currentType = (String) methodContext.get(currentType).get(methodName).keySet().toArray()[0]; diff --git a/src/main/java/abstractSyntaxTree/StatementExpression/ReceivingMethod.java b/src/main/java/abstractSyntaxTree/StatementExpression/ReceivingMethod.java index faf141f..5af4511 100644 --- a/src/main/java/abstractSyntaxTree/StatementExpression/ReceivingMethod.java +++ b/src/main/java/abstractSyntaxTree/StatementExpression/ReceivingMethod.java @@ -2,8 +2,10 @@ package abstractSyntaxTree.StatementExpression; import TypeCheck.TypeCheckException; import abstractSyntaxTree.Expression.IExpression; +import abstractSyntaxTree.Expression.LocalVarIdentifier; import abstractSyntaxTree.Node; import abstractSyntaxTree.Parameter.ParameterList; +import abstractSyntaxTree.Statement.LocalVarDecl; import java.util.HashMap; import java.util.List; @@ -11,6 +13,7 @@ import java.util.List; public class ReceivingMethod implements Node { public String methodName; public List arguments; + public String thisClass; public ReceivingMethod(String methodName, List arguments) { this.methodName = methodName; @@ -18,6 +21,9 @@ public class ReceivingMethod implements Node { } void checkParameters(HashMap>> methodContext, HashMap> typeContext, HashMap localVars) throws TypeCheckException { for (IExpression parameter : arguments){ + if(parameter instanceof LocalVarIdentifier localVarIdentifier){ + localVarIdentifier.thisClass = thisClass; + } parameter.typeCheck(methodContext, typeContext, localVars); } }