From ec38d8049b1eec0b1adcd992a9cbbf994e483a1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krau=C3=9F=2C=20Josefine?= Date: Fri, 31 May 2024 12:59:58 +0200 Subject: [PATCH] gettypecheckresult --- src/main/java/Input.java | 16 ++++++++++------ .../java/abstractSyntaxTree/Class/RefType.java | 4 ++-- .../Datatype/BoolDatatype.java | 5 +++++ .../Datatype/CharDatatype.java | 5 +++++ .../abstractSyntaxTree/Datatype/IDatatype.java | 2 ++ .../abstractSyntaxTree/Datatype/IntDatatype.java | 5 +++++ .../Expression/BinaryExpression.java | 5 +++++ .../Expression/IExpression.java | 2 ++ .../Expression/InstVarExpression.java | 5 +++++ .../Expression/IntConstantExpression.java | 5 +++++ .../Expression/LocalVarIdentifier.java | 5 +++++ .../Expression/UnaryExpression.java | 5 +++++ .../Statement/BlockStatement.java | 5 +++++ .../Statement/EmptyStatement.java | 5 +++++ .../abstractSyntaxTree/Statement/IStatement.java | 1 + .../Statement/IfElseStatement.java | 5 +++++ .../Statement/IfStatement.java | 5 +++++ .../Statement/LocalVarDecl.java | 7 ++++++- .../Statement/ReturnStatement.java | 5 +++++ .../Statement/WhileStatement.java | 5 +++++ .../MethodCallStatementExpression.java | 8 ++++---- .../NewStatementExpression.java | 10 +++++++++- 22 files changed, 106 insertions(+), 14 deletions(-) diff --git a/src/main/java/Input.java b/src/main/java/Input.java index 4b8b0f9..213cea7 100644 --- a/src/main/java/Input.java +++ b/src/main/java/Input.java @@ -1,17 +1,21 @@ +class ExampleEmpty { + +} + class Example { int i; boolean b; char c; + void callM(){ + Example2 example2 = new Example2(); + example2.m(1); + } } class Example2 { boolean instVarBool; int m(int n){ - boolean localBool; - localBool = true; - if(localBool){ - return n; - } - return -1; + boolean a = this.instVarBool; + return n; } } diff --git a/src/main/java/abstractSyntaxTree/Class/RefType.java b/src/main/java/abstractSyntaxTree/Class/RefType.java index 5c858fa..4ce323a 100644 --- a/src/main/java/abstractSyntaxTree/Class/RefType.java +++ b/src/main/java/abstractSyntaxTree/Class/RefType.java @@ -15,8 +15,8 @@ import java.util.Objects; public class RefType extends AbstractType implements Node { - //Class Name - public String name; + + public String name; // Class Name public List fieldDecls; public List methodDecls; boolean hasMain; diff --git a/src/main/java/abstractSyntaxTree/Datatype/BoolDatatype.java b/src/main/java/abstractSyntaxTree/Datatype/BoolDatatype.java index 6b8ccf0..9c043ba 100644 --- a/src/main/java/abstractSyntaxTree/Datatype/BoolDatatype.java +++ b/src/main/java/abstractSyntaxTree/Datatype/BoolDatatype.java @@ -24,4 +24,9 @@ public class BoolDatatype extends AbstractType implements IDatatype{ mv.visitInsn(Opcodes.ICONST_0); // 0 for false } } + + @Override + public TypeCheckResult getTypeCheckResult() { + return getTypeCheckResult(); + } } diff --git a/src/main/java/abstractSyntaxTree/Datatype/CharDatatype.java b/src/main/java/abstractSyntaxTree/Datatype/CharDatatype.java index 1346f0d..9bc9f7c 100644 --- a/src/main/java/abstractSyntaxTree/Datatype/CharDatatype.java +++ b/src/main/java/abstractSyntaxTree/Datatype/CharDatatype.java @@ -24,4 +24,9 @@ public class CharDatatype extends AbstractType implements IDatatype{ mv.visitLdcInsn((int)value); } + + @Override + public TypeCheckResult getTypeCheckResult() { + return getTypeCheckResult(); + } } diff --git a/src/main/java/abstractSyntaxTree/Datatype/IDatatype.java b/src/main/java/abstractSyntaxTree/Datatype/IDatatype.java index d729f96..9f57666 100644 --- a/src/main/java/abstractSyntaxTree/Datatype/IDatatype.java +++ b/src/main/java/abstractSyntaxTree/Datatype/IDatatype.java @@ -10,6 +10,8 @@ public interface IDatatype { // visit method for code generation void codeGen(MethodVisitor mv) throws Exception; + + TypeCheckResult getTypeCheckResult(); } //TODO: Check if we need to differentiate between primitive types and reference types --> for example in "==" \ No newline at end of file diff --git a/src/main/java/abstractSyntaxTree/Datatype/IntDatatype.java b/src/main/java/abstractSyntaxTree/Datatype/IntDatatype.java index 4733931..b94c2f0 100644 --- a/src/main/java/abstractSyntaxTree/Datatype/IntDatatype.java +++ b/src/main/java/abstractSyntaxTree/Datatype/IntDatatype.java @@ -31,4 +31,9 @@ public class IntDatatype extends AbstractType implements IDatatype{ else mv.visitLdcInsn(value); } + + @Override + public TypeCheckResult getTypeCheckResult() { + return getTypeCheckResult(); + } } diff --git a/src/main/java/abstractSyntaxTree/Expression/BinaryExpression.java b/src/main/java/abstractSyntaxTree/Expression/BinaryExpression.java index c4b92a7..3e8bf49 100644 --- a/src/main/java/abstractSyntaxTree/Expression/BinaryExpression.java +++ b/src/main/java/abstractSyntaxTree/Expression/BinaryExpression.java @@ -175,4 +175,9 @@ public class BinaryExpression extends AbstractType implements IExpression{ mv.visitLabel(expressionEnd); } + + @Override + public TypeCheckResult getTypeCheckResult() { + return getTypeCheckResult(); + } } \ No newline at end of file diff --git a/src/main/java/abstractSyntaxTree/Expression/IExpression.java b/src/main/java/abstractSyntaxTree/Expression/IExpression.java index 9730648..db3db58 100644 --- a/src/main/java/abstractSyntaxTree/Expression/IExpression.java +++ b/src/main/java/abstractSyntaxTree/Expression/IExpression.java @@ -15,4 +15,6 @@ public interface IExpression extends Node { // visit method for code generation void codeGen(MethodVisitor mv, LinkedHashMap localVars, HashMap> typeContext) throws Exception; + + TypeCheckResult getTypeCheckResult(); } diff --git a/src/main/java/abstractSyntaxTree/Expression/InstVarExpression.java b/src/main/java/abstractSyntaxTree/Expression/InstVarExpression.java index 25e8fe2..a6db782 100644 --- a/src/main/java/abstractSyntaxTree/Expression/InstVarExpression.java +++ b/src/main/java/abstractSyntaxTree/Expression/InstVarExpression.java @@ -63,4 +63,9 @@ public class InstVarExpression implements IExpression{ // Load the variable onto the stack mv.visitFieldInsn(Opcodes.GETFIELD, classRef.name, fieldName, fieldDescriptor); } + + @Override + public TypeCheckResult getTypeCheckResult() { + return getTypeCheckResult(); + } } diff --git a/src/main/java/abstractSyntaxTree/Expression/IntConstantExpression.java b/src/main/java/abstractSyntaxTree/Expression/IntConstantExpression.java index 08f04bc..89207bc 100644 --- a/src/main/java/abstractSyntaxTree/Expression/IntConstantExpression.java +++ b/src/main/java/abstractSyntaxTree/Expression/IntConstantExpression.java @@ -24,4 +24,9 @@ public class IntConstantExpression extends AbstractType implements IExpression{ public void codeGen(MethodVisitor mv, LinkedHashMap localVars, HashMap> typeContext) throws Exception { } + + @Override + public TypeCheckResult getTypeCheckResult() { + return getTypeCheckResult(); + } } diff --git a/src/main/java/abstractSyntaxTree/Expression/LocalVarIdentifier.java b/src/main/java/abstractSyntaxTree/Expression/LocalVarIdentifier.java index 573e917..c845cb1 100644 --- a/src/main/java/abstractSyntaxTree/Expression/LocalVarIdentifier.java +++ b/src/main/java/abstractSyntaxTree/Expression/LocalVarIdentifier.java @@ -71,4 +71,9 @@ public class LocalVarIdentifier implements IExpression{ break; } } + + @Override + public TypeCheckResult getTypeCheckResult() { + return getTypeCheckResult(); + } } diff --git a/src/main/java/abstractSyntaxTree/Expression/UnaryExpression.java b/src/main/java/abstractSyntaxTree/Expression/UnaryExpression.java index 0b8d5da..1a2d851 100644 --- a/src/main/java/abstractSyntaxTree/Expression/UnaryExpression.java +++ b/src/main/java/abstractSyntaxTree/Expression/UnaryExpression.java @@ -70,4 +70,9 @@ public class UnaryExpression extends AbstractType implements IExpression{ } } + + @Override + public TypeCheckResult getTypeCheckResult() { + return getTypeCheckResult(); + } } diff --git a/src/main/java/abstractSyntaxTree/Statement/BlockStatement.java b/src/main/java/abstractSyntaxTree/Statement/BlockStatement.java index 276f32e..1815aad 100644 --- a/src/main/java/abstractSyntaxTree/Statement/BlockStatement.java +++ b/src/main/java/abstractSyntaxTree/Statement/BlockStatement.java @@ -86,4 +86,9 @@ public class BlockStatement extends AbstractType implements IStatement { statement.codeGen(mv, blockLocalVars, typeContext); } } + + @Override + public TypeCheckResult getTypeCheckResult() { + return getTypeCheckResult(); + } } \ No newline at end of file diff --git a/src/main/java/abstractSyntaxTree/Statement/EmptyStatement.java b/src/main/java/abstractSyntaxTree/Statement/EmptyStatement.java index 481c27c..92c098d 100644 --- a/src/main/java/abstractSyntaxTree/Statement/EmptyStatement.java +++ b/src/main/java/abstractSyntaxTree/Statement/EmptyStatement.java @@ -22,4 +22,9 @@ public class EmptyStatement extends AbstractType implements IStatement{ public void codeGen(MethodVisitor mv, LinkedHashMap localVars, HashMap> typeContext) throws Exception { //An empty statement does not generate any code } + + @Override + public TypeCheckResult getTypeCheckResult() { + return getTypeCheckResult(); + } } diff --git a/src/main/java/abstractSyntaxTree/Statement/IStatement.java b/src/main/java/abstractSyntaxTree/Statement/IStatement.java index 5c9eee8..7e5c2b6 100644 --- a/src/main/java/abstractSyntaxTree/Statement/IStatement.java +++ b/src/main/java/abstractSyntaxTree/Statement/IStatement.java @@ -14,4 +14,5 @@ public interface IStatement extends Node { TypeCheckResult typeCheck(HashMap>> methodContext, HashMap> typeContext, HashMap localVars) throws Exception; void codeGen(MethodVisitor mv, LinkedHashMap localVars, HashMap> typeContext) throws Exception; + TypeCheckResult getTypeCheckResult(); } diff --git a/src/main/java/abstractSyntaxTree/Statement/IfElseStatement.java b/src/main/java/abstractSyntaxTree/Statement/IfElseStatement.java index 8d4d726..ae1fb4a 100644 --- a/src/main/java/abstractSyntaxTree/Statement/IfElseStatement.java +++ b/src/main/java/abstractSyntaxTree/Statement/IfElseStatement.java @@ -70,4 +70,9 @@ public class IfElseStatement extends AbstractType implements IStatement{ mv.visitLabel(statementEnd); //End of the if-else statement } + + @Override + public TypeCheckResult getTypeCheckResult() { + return getTypeCheckResult(); + } } diff --git a/src/main/java/abstractSyntaxTree/Statement/IfStatement.java b/src/main/java/abstractSyntaxTree/Statement/IfStatement.java index 5a9c4b1..9f8a5b7 100644 --- a/src/main/java/abstractSyntaxTree/Statement/IfStatement.java +++ b/src/main/java/abstractSyntaxTree/Statement/IfStatement.java @@ -50,6 +50,11 @@ public class IfStatement extends AbstractType implements IStatement{ mv.visitLabel(conditionFalse); // If the condition is false, the Statements in the ifBlock will not be executed } + + @Override + public TypeCheckResult getTypeCheckResult() { + return getTypeCheckResult(); + } } diff --git a/src/main/java/abstractSyntaxTree/Statement/LocalVarDecl.java b/src/main/java/abstractSyntaxTree/Statement/LocalVarDecl.java index 71df469..7f8e6ea 100644 --- a/src/main/java/abstractSyntaxTree/Statement/LocalVarDecl.java +++ b/src/main/java/abstractSyntaxTree/Statement/LocalVarDecl.java @@ -17,7 +17,7 @@ public class LocalVarDecl implements IStatement{ } @Override public TypeCheckResult typeCheck(HashMap>> methodContext, HashMap> typeContext, HashMap localVars) throws Exception { - TypeCheckHelper.typeExists(this.type, new ArrayList<>(methodContext.keySet())); + TypeCheckHelper.typeExists(this.type, new ArrayList<>(typeContext.keySet())); localVars.put(this.identifier, this.type); @@ -49,4 +49,9 @@ public class LocalVarDecl implements IStatement{ mv.visitVarInsn(Opcodes.ASTORE, index); } } + + @Override + public TypeCheckResult getTypeCheckResult() { + return getTypeCheckResult(); + } } diff --git a/src/main/java/abstractSyntaxTree/Statement/ReturnStatement.java b/src/main/java/abstractSyntaxTree/Statement/ReturnStatement.java index d0b44ee..bf1d1f8 100644 --- a/src/main/java/abstractSyntaxTree/Statement/ReturnStatement.java +++ b/src/main/java/abstractSyntaxTree/Statement/ReturnStatement.java @@ -53,4 +53,9 @@ public class ReturnStatement extends AbstractType implements IStatement{ mv.visitInsn(Opcodes.RETURN); } } + + @Override + public TypeCheckResult getTypeCheckResult() { + return getTypeCheckResult(); + } } diff --git a/src/main/java/abstractSyntaxTree/Statement/WhileStatement.java b/src/main/java/abstractSyntaxTree/Statement/WhileStatement.java index 3246648..51ae104 100644 --- a/src/main/java/abstractSyntaxTree/Statement/WhileStatement.java +++ b/src/main/java/abstractSyntaxTree/Statement/WhileStatement.java @@ -59,4 +59,9 @@ public class WhileStatement extends AbstractType implements IStatement { mv.visitLabel(conditionFalse); } + + @Override + public TypeCheckResult getTypeCheckResult() { + return getTypeCheckResult(); + } } \ No newline at end of file diff --git a/src/main/java/abstractSyntaxTree/StatementExpression/MethodCallStatementExpression.java b/src/main/java/abstractSyntaxTree/StatementExpression/MethodCallStatementExpression.java index a257f6b..5a1c178 100644 --- a/src/main/java/abstractSyntaxTree/StatementExpression/MethodCallStatementExpression.java +++ b/src/main/java/abstractSyntaxTree/StatementExpression/MethodCallStatementExpression.java @@ -66,10 +66,10 @@ public class MethodCallStatementExpression extends AbstractType implements IExpr for (MethodDecl methodDecl : methodDecls) { if (methodDecl.name.equals(methodName)) { //Get the method descriptor - descriptor = methodDecl.getMethodDescriptor(methodContext); + // descriptor = methodDecl.getMethodDescriptor(methodContext); } } - mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, classThatHasTheMethodIfNotThis.name, methodName, descriptor, false); + // mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, classThatHasTheMethodIfNotThis.name, methodName, descriptor, false); } else { // Load this onto the stack @@ -85,10 +85,10 @@ public class MethodCallStatementExpression extends AbstractType implements IExpr for (MethodDecl methodDecl : methodDecls) { if (methodDecl.name.equals(methodName)) { //Get the method descriptor - descriptor = methodDecl.getMethodDescriptor(methodContext); + // descriptor = methodDecl.getMethodDescriptor(methodContext); } } - mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, thisClass.name, methodName, descriptor, false); + // mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, thisClass.name, methodName, descriptor, false); } } } diff --git a/src/main/java/abstractSyntaxTree/StatementExpression/NewStatementExpression.java b/src/main/java/abstractSyntaxTree/StatementExpression/NewStatementExpression.java index 6342503..1b7ab7e 100644 --- a/src/main/java/abstractSyntaxTree/StatementExpression/NewStatementExpression.java +++ b/src/main/java/abstractSyntaxTree/StatementExpression/NewStatementExpression.java @@ -1,6 +1,7 @@ package abstractSyntaxTree.StatementExpression; import TypeCheck.AbstractType; +import TypeCheck.TypeCheckHelper; import TypeCheck.TypeCheckResult; import abstractSyntaxTree.Expression.IExpression; import abstractSyntaxTree.Parameter.ParameterList; @@ -8,6 +9,7 @@ import abstractSyntaxTree.Statement.IStatement; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; +import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; @@ -22,7 +24,13 @@ public class NewStatementExpression extends AbstractType implements IExpression, @Override public TypeCheckResult typeCheck(HashMap>> methodContext, HashMap> typeContext, HashMap localVars) throws Exception { - return null; + if(!TypeCheckHelper.typeExists(className, new ArrayList<>(typeContext.keySet()))){ + throw new Exception("TypeCheck Exception: An instance of " + className + " is created, but the type does not exist."); + } + TypeCheckResult result = new TypeCheckResult(); + result.type = className; + setTypeCheckResult(result); + return result; } @Override