From 1c43d3ca91e3b13d015a165d4fbce34e78fa62df Mon Sep 17 00:00:00 2001 From: Apoorva Ranade Date: Thu, 1 Apr 2021 20:50:08 +0530 Subject: [PATCH] Fixed return type error --- .../java/chocopy/pa2/DeclarationAnalyzer.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/main/java/chocopy/pa2/DeclarationAnalyzer.java b/src/main/java/chocopy/pa2/DeclarationAnalyzer.java index 1c995b9..0c0510e 100644 --- a/src/main/java/chocopy/pa2/DeclarationAnalyzer.java +++ b/src/main/java/chocopy/pa2/DeclarationAnalyzer.java @@ -163,7 +163,7 @@ public class DeclarationAnalyzer extends AbstractNodeAnalyzer if(!firstPass){ ValueType returnType = ValueType.annotationToValueType(node.returnType); - if(returnType!=null && !returnType.isSpecialType() && !(globals.get(returnType.className()) instanceof ClassVType)) + if(returnType!=null && !returnType.isSpecialType() && !returnType.isListType() && !(globals.get(returnType.className()) instanceof ClassVType)) errors.semError( node.returnType, "Invalid type annotation; there is no class named: %s", returnType.className()); @@ -260,7 +260,8 @@ public class DeclarationAnalyzer extends AbstractNodeAnalyzer !(params.get(0) instanceof ClassValueType)|| !((ClassValueType)params.get(0)).className().equals(current_class.className)) errors.semError(id, "Method overridden with different type signature: __init__"); - else sym.put(name, current_func); + else + sym.put(name, current_func); if(params.size() < 1 || (params.get(0) instanceof ClassValueType==false) || ((ClassValueType)params.get(0)).className().equals(current_class.className)==false) errors.semError( id, "First parameter of the following method must be of the enclosing class: %s", name); @@ -283,7 +284,10 @@ public class DeclarationAnalyzer extends AbstractNodeAnalyzer } else sym.put(name, current_func); - } else if (super_syms.contains(name)) + } + else if (name.equals("__init__") && !(type instanceof FuncType)) + errors.semError(id, "Cannot re-define attribute: %s", name); + else if (super_syms.contains(name)) errors.semError(id, "Cannot re-define attribute: %s", name); else sym.put(name, type); @@ -304,20 +308,16 @@ public class DeclarationAnalyzer extends AbstractNodeAnalyzer } boolean isVariableType(Type ty) { - return ty.isSpecialType() || ty.equals(Type.OBJECT_TYPE); + return ty.isSpecialType() || ty.equals(Type.OBJECT_TYPE)|| ty.isListType(); } @Override public Type analyze(NonLocalDecl node) { - SymbolTable curr_sym=sym; - while(curr_sym.getParent()!=null) + SymbolTable parent=sym.getParent(); + if (parent.getParent()!=null && parent.declares(node.variable.name) && isVariableType(sym.get(node.variable.name))) { - if (curr_sym.declares(node.variable.name) && isVariableType(sym.get(node.variable.name))) - { - sym.put(node.variable.name, sym.get(node.variable.name)); - return sym.get(node.variable.name); - } - curr_sym=curr_sym.getParent(); + sym.put(node.variable.name, sym.get(node.variable.name)); + return sym.get(node.variable.name); } errors.semError( node.variable, "Not a nonlocal variable: %s", node.variable.name);