Initial commit

master
github-classroom[bot] 3 years ago
commit b758a071dc

149
.gitignore vendored

@ -0,0 +1,149 @@
.DS_Store
__pycache__
target
# Created by https://www.gitignore.io/api/java,eclipse,intellij,emacs,vim
### Java ###
*.class
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
### Eclipse ###
*.pydevproject
.metadata
.gradle
bin/
tmp/
*.tmp
*.bak
*.swp
*~.nib
local.properties
.settings/
.loadpath
# Eclipse Core
.project
# External tool builders
.externalToolBuilders/
# Locally stored "Eclipse launch configurations"
*.launch
# CDT-specific
.cproject
# JDT-specific (Eclipse Java Development Tools)
.classpath
# Java annotation processor (APT)
.factorypath
# PDT-specific
.buildpath
# sbteclipse plugin
.target
# TeXlipse plugin
.texlipse
### Intellij ###
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio
*.iml
## Directory-based project format:
.idea/
# if you remove the above rule, at least ignore the following:
# User-specific stuff:
# .idea/workspace.xml
# .idea/tasks.xml
# .idea/dictionaries
# Sensitive or high-churn files:
# .idea/dataSources.ids
# .idea/dataSources.xml
# .idea/sqlDataSources.xml
# .idea/dynamic.xml
# .idea/uiDesigner.xml
# Gradle:
# .idea/gradle.xml
# .idea/libraries
# Mongo Explorer plugin:
# .idea/mongoSettings.xml
## File-based project format:
*.ipr
*.iws
## Plugin-specific files:
# IntelliJ
/out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
### Emacs ###
# -*- mode: gitignore; -*-
*~
\#*\#
/.emacs.desktop
/.emacs.desktop.lock
*.elc
auto-save-list
tramp
.\#*
# Org-mode
.org-id-locations
*_archive
# flymake-mode
*_flymake.*
# eshell files
/eshell/history
/eshell/lastdir
# elpa packages
/elpa/
# reftex files
*.rel
# AUCTeX auto folder
/auto/
# cask packages
.cask/
### Vim ###
[._]*.s[a-w][a-z]
[._]s[a-w][a-z]
*.un~
Session.vim
.netrwhist
*~

@ -0,0 +1,26 @@
Copyright (c) 2017-2018 The Regents of the University of California
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

@ -0,0 +1,35 @@
# NYU Compiler Construction CSCI-GA.2130/Spring 2021: Programming Assignment 2
This assignment is adapted from https://github.com/cs164berkeley/pa2-chocopy-semantic-analysis with the authors' permission.
See the PA2 document on Piazza for a detailed specification.
## Quickstart
Run the following commands to compile your analyzer and run the tests:
```
mvn clean package
java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy \
--pass=.s --test --dir src/test/data/pa2/sample/
```
The dot in `--pass` makes the compiler skip parsing and go straight to semantic analysis.
`--pass=.s` uses your (`s` for `student`) analyzer to perform semantic analysis on a preparsed input (in this case, the `.ast` files under `src/test/data/pa2/sample/`).
With the starter code, only two tests should pass.
Your main objective is to build an analyzer that passes all the provided tests.
`--pass=.r` uses the reference (`r` for `reference`) analyzer, which should pass all tests.
In addition to running in test mode with `--test`, you can also observe the actual output of your (or reference) analyzer with:
```
java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy \
--pass=.s src/test/data/pa2/sample/expr_unary.py.ast
```
You can also run both passes on the original `.py` file:
```
java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy \
--pass=rr src/test/data/pa2/sample/expr_unary.py
```
Once you merge your parser code from assignment 1, you should be able to use `--pass=ss`.

Binary file not shown.

@ -0,0 +1,330 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>chocopy</groupId>
<artifactId>chocopy</artifactId>
<packaging>jar</packaging>
<version>2.2-SNAPSHOT</version>
<name>chocopy</name>
<url>http://maven.apache.org</url>
<!-- Set this property to true on the command-line for very verbose output -->
<properties>
<chocopy.debug>false</chocopy.debug>
</properties>
<build>
<!-- Specify JFlex and CUP plugins here; execute in profiles -->
<pluginManagement>
<plugins>
<plugin>
<groupId>de.jflex</groupId>
<artifactId>jflex-maven-plugin</artifactId>
<version>1.6.1</version>
</plugin>
<plugin>
<groupId>com.github.vbmacher</groupId>
<artifactId>cup-maven-plugin</artifactId>
<version>11b-20160615</version>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>3.7.1</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<finalName>assignment</finalName>
<appendAssemblyId>false</appendAssemblyId>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase> <!-- bind to the packaging phase -->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<encoding>UTF-8</encoding>
<source>1.8</source>
<target>1.8</target>
<parameters>true</parameters>
<debug>true</debug>
</configuration>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/asm</directory>
<includes>
<include>**/*.s</include>
<include>**/*.os</include>
</includes>
<excludes>
<exclude>**/reference/*.s</exclude>
</excludes>
</resource>
</resources>
</build>
<profiles>
<profile>
<id>reference</id>
<activation>
<!-- This profile is activated whenever we have the reference sources available -->
<file>
<exists>src/main/java/chocopy/reference/</exists>
</file>
</activation>
<build>
<plugins>
<!-- Do not include student skeletons in the reference JAR -->
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<excludes>
<exclude>**/pa1/*</exclude>
<exclude>**/pa2/*</exclude>
<exclude>**/pa3/*</exclude>
</excludes>
</configuration>
</plugin>
<!-- Name the generated JAR differently so that it is different from the student version -->
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<finalName>chocopy-ref</finalName>
<appendAssemblyId>false</appendAssemblyId>
</configuration>
</plugin>
<!-- Run JFlex to generate reference lexer -->
<plugin>
<groupId>de.jflex</groupId>
<artifactId>jflex-maven-plugin</artifactId>
<executions>
<execution>
<id>jflex-reference</id>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<lexDefinitions>
<lexDefinition>src/main/jflex/chocopy/reference/ChocoPy.jflex</lexDefinition>
</lexDefinitions>
<dump>${chocopy.debug}</dump>
<verbose>true</verbose>
</configuration>
</execution>
</executions>
</plugin>
<!-- Run CUP to generate reference parser -->
<plugin>
<groupId>com.github.vbmacher</groupId>
<artifactId>cup-maven-plugin</artifactId>
<executions>
<execution>
<id>cup-reference</id>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<cupDefinition>src/main/cup/chocopy/reference/ChocoPy.cup</cupDefinition>
<packageName>chocopy.reference</packageName>
<className>ChocoPyParser</className>
<symbolsName>ChocoPyTokens</symbolsName>
<dumpTables>${chocopy.debug}</dumpTables>
<dumpStates>${chocopy.debug}</dumpStates>
<dumpGrammar>${chocopy.debug}</dumpGrammar>
<locations>true</locations>
</configuration>
</execution>
</executions>
</plugin>
<!-- No debug -->
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<debug>true</debug>
<debuglevel>none</debuglevel>
</configuration>
</plugin>
<!-- Copy dependencies to target/ -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>pa1</id>
<activation>
<!-- This profile is activated whenever we are in a PA1 distribution -->
<file>
<exists>src/main/java/chocopy/pa1</exists>
</file>
</activation>
<build>
<plugins>
<!-- Run JFlex on the student version -->
<plugin>
<groupId>de.jflex</groupId>
<artifactId>jflex-maven-plugin</artifactId>
<executions>
<execution>
<id>jflex-pa1</id>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<lexDefinitions>
<lexDefinition>src/main/jflex/chocopy/pa1/ChocoPy.jflex</lexDefinition>
</lexDefinitions>
<dump>${chocopy.debug}</dump>
<verbose>true</verbose>
</configuration>
</execution>
</executions>
</plugin>
<!-- Run CUP on the student version -->
<plugin>
<groupId>com.github.vbmacher</groupId>
<artifactId>cup-maven-plugin</artifactId>
<executions>
<execution>
<id>cup-pa1</id>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<cupDefinition>src/main/cup/chocopy/pa1/ChocoPy.cup</cupDefinition>
<packageName>chocopy.pa1</packageName>
<className>ChocoPyParser</className>
<symbolsName>ChocoPyTokens</symbolsName>
<dumpTables>${chocopy.debug}</dumpTables>
<dumpStates>${chocopy.debug}</dumpStates>
<dumpGrammar>${chocopy.debug}</dumpGrammar>
<locations>true</locations>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>pa2</id>
<activation>
<!-- This profile is activated whenever we are in a PA2 distribution -->
<file>
<exists>src/main/java/chocopy/pa2</exists>
</file>
</activation>
</profile>
<profile>
<id>pa3</id>
<activation>
<!-- This profile is activated whenever we are in a PA3 distribution -->
<file>
<exists>src/main/java/chocopy/pa3</exists>
</file>
</activation>
</profile>
</profiles>
<repositories>
<repository>
<id>venus164-repo</id>
<name>Repository for Venus164</name>
<url>https://raw.githubusercontent.com/chocopy/venus/maven-repository/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>net.sourceforge.argparse4j</groupId>
<artifactId>argparse4j</artifactId>
<version>0.8.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>[2.9.10.1,)</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-parameter-names</artifactId>
<version>2.9.10</version>
</dependency>
<dependency>
<groupId>com.github.vbmacher</groupId>
<artifactId>java-cup-runtime</artifactId>
<version>11b-20160615</version>
</dependency>
<!-- https://mvnrepository.com/artifact/de.jflex/jflex -->
<dependency>
<groupId>de.jflex</groupId>
<artifactId>jflex</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
<version>1.2.71</version>
</dependency>
<dependency>
<groupId>edu.berkeley.eecs.venus164</groupId>
<artifactId>venus164</artifactId>
<version>0.2.4</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>net.sf.proguard</groupId>
<artifactId>proguard-base</artifactId>
<version>6.0.3</version>
</dependency>
</dependencies>
</project>

@ -0,0 +1,54 @@
package chocopy.common;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.stream.Collectors;
/** Utility functions for general use. */
public class Utils {
/**
* Return resource file FILENAME's contents as a string. FILENAME can refer to a file within the
* class hierarchy, so that a text resource in file resource.txt in the chocopy.common.codegen
* package, for example, could be referred to with FILENAME chocopy/common/codegen/resource.txt.
*
* <p>Credit: Lucio Paiva.
*/
public static String getResourceFileAsString(String fileName) {
InputStream is = Utils.class.getClassLoader().getResourceAsStream(fileName);
if (is != null) {
BufferedReader reader =
new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));
return reader.lines().collect(Collectors.joining(System.lineSeparator()));
}
return null;
}
/**
* Return an exception signalling a fatal error having a message formed from MSGFORMAT and ARGS,
* as for String.format.
*/
public static Error fatal(String msgFormat, Object... args) {
return new Error(String.format(msgFormat, args));
}
/**
* Return the string S padded with FILL to TOLEN characters. Padding is on the left if
* PADONLEFT, and otherwise on the right. If S is already at least TOLEN characters, returns S.
*/
public static String pad(String s, Character fill, int toLen, boolean padOnLeft) {
StringBuilder result = new StringBuilder(toLen);
if (!padOnLeft) {
result.append(s);
}
for (int n = s.length(); n < toLen; n += 1) {
result.append(fill);
}
if (padOnLeft) {
result.append(s);
}
return result.toString();
}
}

@ -0,0 +1,174 @@
package chocopy.common.analysis;
import chocopy.common.astnodes.*;
/**
* An empty implementation of the {@link NodeAnalyzer} that simply returns does nothing and returns
* null for every AST node type.
*
* <p>T is the type of analysis result.
*/
public class AbstractNodeAnalyzer<T> implements NodeAnalyzer<T> {
@Override
public T analyze(AssignStmt node) {
return defaultAction(node);
}
@Override
public T analyze(BinaryExpr node) {
return defaultAction(node);
}
@Override
public T analyze(BooleanLiteral node) {
return defaultAction(node);
}
@Override
public T analyze(CallExpr node) {
return defaultAction(node);
}
@Override
public T analyze(ClassDef node) {
return defaultAction(node);
}
@Override
public T analyze(ClassType node) {
return defaultAction(node);
}
@Override
public T analyze(CompilerError node) {
return defaultAction(node);
}
@Override
public T analyze(Errors node) {
return defaultAction(node);
}
@Override
public T analyze(ExprStmt node) {
return defaultAction(node);
}
@Override
public T analyze(ForStmt node) {
return defaultAction(node);
}
@Override
public T analyze(FuncDef node) {
return defaultAction(node);
}
@Override
public T analyze(GlobalDecl node) {
return defaultAction(node);
}
@Override
public T analyze(Identifier node) {
return defaultAction(node);
}
@Override
public T analyze(IfExpr node) {
return defaultAction(node);
}
@Override
public T analyze(IfStmt node) {
return defaultAction(node);
}
@Override
public T analyze(IndexExpr node) {
return defaultAction(node);
}
@Override
public T analyze(IntegerLiteral node) {
return defaultAction(node);
}
@Override
public T analyze(ListExpr node) {
return defaultAction(node);
}
@Override
public T analyze(ListType node) {
return defaultAction(node);
}
@Override
public T analyze(MemberExpr node) {
return defaultAction(node);
}
@Override
public T analyze(MethodCallExpr node) {
return defaultAction(node);
}
@Override
public T analyze(NoneLiteral node) {
return defaultAction(node);
}
@Override
public T analyze(NonLocalDecl node) {
return defaultAction(node);
}
@Override
public T analyze(Program node) {
return defaultAction(node);
}
@Override
public T analyze(ReturnStmt node) {
return defaultAction(node);
}
@Override
public T analyze(StringLiteral node) {
return defaultAction(node);
}
@Override
public T analyze(TypedVar node) {
return defaultAction(node);
}
@Override
public T analyze(UnaryExpr node) {
return defaultAction(node);
}
@Override
public T analyze(VarDef node) {
return defaultAction(node);
}
@Override
public T analyze(WhileStmt node) {
return defaultAction(node);
}
@Override
public void setDefault(T value) {
defaultValue = value;
}
@Override
public T defaultAction(Node node) {
return defaultValue;
}
/** Default value for non-overridden methods. */
private T defaultValue = null;
}

@ -0,0 +1,93 @@
package chocopy.common.analysis;
import chocopy.common.astnodes.*;
/**
* This interface can be used to separate logic for various concrete classes in the AST class
* hierarchy.
*
* <p>The idea is that a phase of the analysis is encapsulated in a class that implements this
* interface, and contains an overriding of the analyze method for each concrete Node class that
* needs something other than default processing. Each concrete node class, C, implements a generic
* dispatch method that takes a NodeAnalyzer<T> argument and calls the overloading of analyze that
* takes an argument of type C. The effect is that anode.dispatch(anAnalyzer) executes the method
* anAnalyzer.analyze that is appropriate to aNode's dynamic type. As a result each NodeAnalyzer
* subtype encapsulates all implementations of a particular action on Nodes. Thus, it inverts the
* usual OO pattern in which the implementations of analysis A for each different class are
* scattered among the class bodies themselves as overridings of a method A on the Node class.
*
* <p>The class AbstractNodeAnalyzer provides empty default implementations for these methods.
*
* <p>The type T is the type of result returned by the encapsulated analysis.
*/
public interface NodeAnalyzer<T> {
T analyze(AssignStmt node);
T analyze(BinaryExpr node);
T analyze(BooleanLiteral node);
T analyze(CallExpr node);
T analyze(ClassDef node);
T analyze(ClassType node);
T analyze(CompilerError node);
T analyze(Errors node);
T analyze(ExprStmt node);
T analyze(ForStmt node);
T analyze(FuncDef node);
T analyze(GlobalDecl node);
T analyze(Identifier node);
T analyze(IfExpr node);
T analyze(IfStmt node);
T analyze(IndexExpr node);
T analyze(IntegerLiteral node);
T analyze(ListExpr node);
T analyze(ListType node);
T analyze(MemberExpr node);
T analyze(MethodCallExpr node);
T analyze(NoneLiteral node);
T analyze(NonLocalDecl node);
T analyze(Program node);
T analyze(ReturnStmt node);
T analyze(StringLiteral node);
T analyze(TypedVar node);
T analyze(UnaryExpr node);
T analyze(VarDef node);
T analyze(WhileStmt node);
/**
* Set the default value returned by calls to analyze that are not overridden to VALUE. By
* default, this is null.
*/
void setDefault(T value);
/** Default value for non-overridden methods. */
T defaultAction(Node node);
}

@ -0,0 +1,62 @@
package chocopy.common.analysis;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* A block-structured symbol table a mapping identifiers to information about them of type T in a
* given declarative region.
*/
public class SymbolTable<T> {
/** Contents of the current (innermost) region. */
private final Map<String, T> tab = new HashMap<>();
/** Enclosing block. */
private final SymbolTable<T> parent;
/** A table representing a region nested in that represented by PARENT0. */
public SymbolTable(SymbolTable<T> parent0) {
parent = parent0;
}
/** A top-level symbol table. */
public SymbolTable() {
this.parent = null;
}
/** Returns the mapping of NAME in the innermost nested region containing this one. */
public T get(String name) {
if (tab.containsKey(name)) {
return tab.get(name);
} else if (parent != null) {
return parent.get(name);
} else {
return null;
}
}
/**
* Adds a new mapping of NAME -> VALUE to the current region, possibly shadowing mappings in the
* enclosing parent. Returns modified table.
*/
public SymbolTable<T> put(String name, T value) {
tab.put(name, value);
return this;
}
/** Returns whether NAME has a mapping in this region (ignoring enclosing regions. */
public boolean declares(String name) {
return tab.containsKey(name);
}
/** Returns all the names declared this region (ignoring enclosing regions). */
public Set<String> getDeclaredSymbols() {
return tab.keySet();
}
/** Returns the parent, or null if this is the top level. */
public SymbolTable<T> getParent() {
return this.parent;
}
}

@ -0,0 +1,53 @@
package chocopy.common.analysis.types;
import chocopy.common.astnodes.ClassType;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.Objects;
/** Represents the semantic value of a simple class reference. */
public class ClassValueType extends ValueType {
/** The name of the class. */
private final String className;
/** A class type for the class named CLASSNAME. */
@JsonCreator
public ClassValueType(@JsonProperty String className) {
this.className = className;
}
/** A class type for the class referenced by CLASSTYPEANNOTATION. */
public ClassValueType(ClassType classTypeAnnotation) {
this.className = classTypeAnnotation.className;
}
@Override
@JsonProperty
public String className() {
return className;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
ClassValueType classType = (ClassValueType) o;
return Objects.equals(className, classType.className);
}
@Override
public int hashCode() {
return Objects.hash(className);
}
@Override
public String toString() {
return className;
}
}

@ -0,0 +1,45 @@
package chocopy.common.analysis.types;
import com.fasterxml.jackson.annotation.JsonCreator;
import java.util.ArrayList;
import java.util.List;
/** Semantic information for a function or method. */
public class FuncType extends Type {
/** Types of parameters. */
public final List<ValueType> parameters;
/** Function's return type. */
public final ValueType returnType;
/** Create a FuncType returning RETURNTYPE0, initially parameterless. */
public FuncType(ValueType returnType0) {
this(new ArrayList<>(), returnType0);
}
/**
* Create a FuncType for NAME0 with formal parameter types PARAMETERS0, returning type
* RETURNTYPE0.
*/
@JsonCreator
public FuncType(List<ValueType> parameters0, ValueType returnType0) {
this.parameters = parameters0;
this.returnType = returnType0;
}
@Override
public boolean isFuncType() {
return true;
}
/** Return the type of the K-th parameter. */
public ValueType getParamType(int k) {
return parameters.get(k);
}
@Override
public String toString() {
return "<function>";
}
}

@ -0,0 +1,57 @@
package chocopy.common.analysis.types;
import chocopy.common.astnodes.ListType;
import com.fasterxml.jackson.annotation.JsonCreator;
import java.util.Objects;
/** Represents a semantic value of a list type denotation. */
public class ListValueType extends ValueType {
/** This ListValueType represents [ELEMENTTYPE]. */
public final ValueType elementType;
/** Represents [ELEMENTTYPE]. */
@JsonCreator
public ListValueType(Type elementType) {
this.elementType = (ValueType) elementType;
}
/** Represents [<type>], where <type> is that denoted in TYPEANNOTATION. */
public ListValueType(ListType typeAnnotation) {
elementType = ValueType.annotationToValueType(typeAnnotation.elementType);
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
ListValueType listType = (ListValueType) o;
return Objects.equals(elementType, listType.elementType);
}
@Override
public int hashCode() {
return Objects.hash(elementType);
}
@Override
public String toString() {
return "[" + elementType.toString() + "]";
}
/** Returns true iff I represent [T]. */
@Override
public boolean isListType() {
return true;
}
@Override
public ValueType elementType() {
return elementType;
}
}

@ -0,0 +1,68 @@
package chocopy.common.analysis.types;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
/**
* Representation for the static type of symbols and expressions during type-checking.
*
* <p>Symbols such as variables and attributes will typically map to a {@link ValueType}.
*
* <p>Symbols such as classes will typically map to a more complex Type.
*/
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "kind")
@JsonSubTypes({
@JsonSubTypes.Type(FuncType.class),
@JsonSubTypes.Type(ClassValueType.class),
@JsonSubTypes.Type(ListValueType.class)
})
public abstract class Type {
/** The type object. */
public static final ClassValueType OBJECT_TYPE = new ClassValueType("object");
/** The type int. */
public static final ClassValueType INT_TYPE = new ClassValueType("int");
/** The type str. */
public static final ClassValueType STR_TYPE = new ClassValueType("str");
/** The type bool. */
public static final ClassValueType BOOL_TYPE = new ClassValueType("bool");
/** The type of None. */
public static final ClassValueType NONE_TYPE = new ClassValueType("<None>");
/** The type of []. */
public static final ClassValueType EMPTY_TYPE = new ClassValueType("<Empty>");
/** Returns the name of the class, if this is a class type, Otherwise null. */
public String className() {
return null;
}
/** Return true iff this is a type that does not include the value None. */
@JsonIgnore
public boolean isSpecialType() {
return equals(INT_TYPE) || equals(BOOL_TYPE) || equals(STR_TYPE);
}
@JsonIgnore
public boolean isListType() {
return false;
}
@JsonIgnore
public boolean isFuncType() {
return false;
}
/** Return true iff this type represents a kind of assignable value. */
@JsonIgnore
public boolean isValueType() {
return false;
}
/** For list types, return the type of the elements; otherwise null. */
@JsonIgnore
public ValueType elementType() {
return null;
}
}

@ -0,0 +1,29 @@
package chocopy.common.analysis.types;
import chocopy.common.astnodes.ClassType;
import chocopy.common.astnodes.ListType;
import chocopy.common.astnodes.TypeAnnotation;
/**
* A ValueType references types that are assigned to variables and expressions.
*
* <p>In particular, ValueType can be a {@link ClassValueType} (e.g. "int") or a {@link
* ListValueType} (e.g. "[int]").
*/
public abstract class ValueType extends Type {
/** Returns the type corresponding to ANNOTATION. */
public static ValueType annotationToValueType(TypeAnnotation annotation) {
if (annotation instanceof ClassType) {
return new ClassValueType((ClassType) annotation);
} else {
assert annotation instanceof ListType;
return new ListValueType((ListType) annotation);
}
}
@Override
public boolean isValueType() {
return true;
}
}

@ -0,0 +1,25 @@
package chocopy.common.astnodes;
import chocopy.common.analysis.NodeAnalyzer;
import java_cup.runtime.ComplexSymbolFactory.Location;
import java.util.List;
/** Single and multiple assignments. */
public class AssignStmt extends Stmt {
/** List of left-hand sides. */
public final List<Expr> targets;
/** Right-hand-side value to be assigned. */
public final Expr value;
/** AST for TARGETS[0] = TARGETS[1] = ... = VALUE spanning source locations [LEFT..RIGHT]. */
public AssignStmt(Location left, Location right, List<Expr> targets, Expr value) {
super(left, right);
this.targets = targets;
this.value = value;
}
public <T> T dispatch(NodeAnalyzer<T> analyzer) {
return analyzer.analyze(this);
}
}

@ -0,0 +1,31 @@
package chocopy.common.astnodes;
import chocopy.common.analysis.NodeAnalyzer;
import java_cup.runtime.ComplexSymbolFactory.Location;
/** <operand> <operator> <operand>. */
public class BinaryExpr extends Expr {
/** Left operand. */
public final Expr left;
/** Operator name. */
public final String operator;
/** Right operand. */
public final Expr right;
/**
* An AST for expressions of the form LEFTEXPR OP RIGHTEXPR from text in range
* [LEFTLOC..RIGHTLOC].
*/
public BinaryExpr(
Location leftLoc, Location rightLoc, Expr leftExpr, String op, Expr rightExpr) {
super(leftLoc, rightLoc);
left = leftExpr;
operator = op;
right = rightExpr;
}
public <T> T dispatch(NodeAnalyzer<T> analyzer) {
return analyzer.analyze(this);
}
}

@ -0,0 +1,21 @@
package chocopy.common.astnodes;
import chocopy.common.analysis.NodeAnalyzer;
import java_cup.runtime.ComplexSymbolFactory.Location;
/** Literals True or False. */
public final class BooleanLiteral extends Literal {
/** True iff I represent True. */
public final boolean value;
/** An AST for the token True or False at [LEFT..RIGHT], depending on VALUE. */
public BooleanLiteral(Location left, Location right, boolean value) {
super(left, right);
this.value = value;
}
public <T> T dispatch(NodeAnalyzer<T> analyzer) {
return analyzer.analyze(this);
}
}

@ -0,0 +1,26 @@
package chocopy.common.astnodes;
import chocopy.common.analysis.NodeAnalyzer;
import java_cup.runtime.ComplexSymbolFactory.Location;
import java.util.List;
/** A function call. */
public class CallExpr extends Expr {
/** The called function. */
public final Identifier function;
/** The actual parameter expressions. */
public final List<Expr> args;
/** AST for FUNCTION(ARGS) at [LEFT..RIGHT]. */
public CallExpr(Location left, Location right, Identifier function, List<Expr> args) {
super(left, right);
this.function = function;
this.args = args;
}
public <T> T dispatch(NodeAnalyzer<T> analyzer) {
return analyzer.analyze(this);
}
}

@ -0,0 +1,39 @@
package chocopy.common.astnodes;
import chocopy.common.analysis.NodeAnalyzer;
import java_cup.runtime.ComplexSymbolFactory.Location;
import java.util.List;
/** A class definition. */
public class ClassDef extends Declaration {
/** Name of the declared class. */
public final Identifier name;
/** Name of the parent class. */
public final Identifier superClass;
/** Body of the class. */
public final List<Declaration> declarations;
/** An AST for class NAME(SUPERCLASS): DECLARATIONS. spanning source locations [LEFT..RIGHT]. */
public ClassDef(
Location left,
Location right,
Identifier name,
Identifier superClass,
List<Declaration> declarations) {
super(left, right);
this.name = name;
this.superClass = superClass;
this.declarations = declarations;
}
public <T> T dispatch(NodeAnalyzer<T> analyzer) {
return analyzer.analyze(this);
}
@Override
public Identifier getIdentifier() {
return this.name;
}
}

@ -0,0 +1,21 @@
package chocopy.common.astnodes;
import chocopy.common.analysis.NodeAnalyzer;
import java_cup.runtime.ComplexSymbolFactory.Location;
/** A simple class type name. */
public final class ClassType extends TypeAnnotation {
/** The denotation of the class in source. */
public final String className;
/** An AST denoting a type named CLASSNAME0 at [LEFT..RIGHT]. */
public ClassType(Location left, Location right, String className0) {
super(left, right);
className = className0;
}
public <T> T dispatch(NodeAnalyzer<T> analyzer) {
return analyzer.analyze(this);
}
}

@ -0,0 +1,56 @@
package chocopy.common.astnodes;
import chocopy.common.analysis.NodeAnalyzer;
import com.fasterxml.jackson.annotation.JsonInclude;
import java_cup.runtime.ComplexSymbolFactory.Location;
import java.util.Arrays;
import java.util.Objects;
/** Represents a single error. Does not correspond to any Python source construct. */
public class CompilerError extends Node {
/**
* Represents an error with message MESSAGE. Iff SYNTAX, it is a syntactic error. The error
* applies to source text at [LEFT..RIGHT].
*/
public CompilerError(Location left, Location right, String message, boolean syntax) {
super(left, right);
this.message = message;
this.syntax = syntax;
}
@JsonInclude(JsonInclude.Include.NON_DEFAULT)
public boolean isSyntax() {
return syntax;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
CompilerError that = (CompilerError) o;
return Objects.equals(message, that.message)
&& Arrays.equals(getLocation(), that.getLocation());
}
@Override
public int hashCode() {
int result = Objects.hash(message);
result = 31 * result + Arrays.hashCode(getLocation());
return result;
}
public <T> T dispatch(NodeAnalyzer<T> analyzer) {
return analyzer.analyze(this);
}
/** The error message. */
public final String message;
/** True if this is a syntax error. */
private final boolean syntax;
}

@ -0,0 +1,17 @@
package chocopy.common.astnodes;
import com.fasterxml.jackson.annotation.JsonIgnore;
import java_cup.runtime.ComplexSymbolFactory.Location;
/** Base of all AST nodes representing definitions or declarations. */
public abstract class Declaration extends Node {
/** A definition or declaration spanning source locations [LEFT..RIGHT]. */
public Declaration(Location left, Location right) {
super(left, right);
}
/** Return the identifier defined by this Declaration. */
@JsonIgnore
public abstract Identifier getIdentifier();
}

@ -0,0 +1,71 @@
package chocopy.common.astnodes;
import chocopy.common.analysis.NodeAnalyzer;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnore;
import java_cup.runtime.ComplexSymbolFactory.Location;
import java.util.List;
/** Collects the error messages in a Program. There is exactly one per Program node. */
public class Errors extends Node {
/** The accumulated error messages in the order added. */
public final List<CompilerError> errors;
/** True iff multiple semantic errors allowed on a node. */
@JsonIgnore private boolean allowMultipleErrors;
/**
* An Errors whose list of CompilerErrors is ERRORS. The list should be modified using this.add.
*/
@JsonCreator
public Errors(List<CompilerError> errors) {
super(null, null);
this.errors = errors;
allowMultipleErrors = true;
}
/** Return true iff there are any errors. */
public boolean hasErrors() {
return !this.errors.isEmpty();
}
/** Prevent multiple semantic errors on the same node. */
public void suppressMultipleErrors() {
allowMultipleErrors = false;
}
/**
* Add a new semantic error message attributed to NODE, with message String.format(MESSAGEFORM,
* ARGS).
*/
public void semError(Node node, String messageForm, Object... args) {
if (allowMultipleErrors || !node.hasError()) {
String msg = String.format(messageForm, args);
CompilerError err = new CompilerError(null, null, msg, false);
err.setLocation(node.getLocation());
add(err);
if (!node.hasError()) {
node.setErrorMsg(msg);
}
}
}
/**
* Add a new syntax error message attributed to the source text between LEFT and RIGHT, and with
* message String.format(MESSAGEFORM, ARGS).
*/
public void syntaxError(Location left, Location right, String messageForm, Object... args) {
add(new CompilerError(left, right, String.format(messageForm, args), true));
}
/** Add ERR to the list of errors. */
public void add(CompilerError err) {
errors.add(err);
}
public <T> T dispatch(NodeAnalyzer<T> analyzer) {
return analyzer.analyze(this);
}
}

@ -0,0 +1,43 @@
package chocopy.common.astnodes;
import chocopy.common.analysis.types.Type;
import com.fasterxml.jackson.annotation.JsonInclude;
import java_cup.runtime.ComplexSymbolFactory.Location;
/**
* Base of all AST nodes representing expressions.
*
* <p>There is nothing in this class, but there will be many AST node types that have fields that
* are *any expression*. For those cases, having a field of this type will encompass all types of
* expressions such as binary expressions and literals that subclass this class.
*/
public abstract class Expr extends Node {
/** A Python expression spanning source locations [LEFT..RIGHT]. */
public Expr(Location left, Location right) {
super(left, right);
}
/**
* The type of the value that this expression evaluates to.
*
* <p>This field is always <tt>null</tt> after the parsing stage, but is populated by the
* typechecker in the semantic analysis stage.
*
* <p>After typechecking this field may be <tt>null</tt> only for expressions that cannot be
* assigned a type. In particular, {@link NoneLiteral} expressions will not have a typed
* assigned to them.
*/
@JsonInclude(JsonInclude.Include.NON_NULL)
private Type inferredType;
/** Set getInferredType() to TYPE, returning TYPE. */
public Type setInferredType(Type type) {
inferredType = type;
return type;
}
public Type getInferredType() {
return inferredType;
}
}

@ -0,0 +1,21 @@
package chocopy.common.astnodes;
import chocopy.common.analysis.NodeAnalyzer;
import java_cup.runtime.ComplexSymbolFactory.Location;
/** Statements consisting of expressions. */
public final class ExprStmt extends Stmt {
/** The expression I evaluate. */
public final Expr expr;
/** The AST for EXPR spanning source locations [LEFT..RIGHT] in a statement context. */
public ExprStmt(Location left, Location right, Expr expr) {
super(left, right);
this.expr = expr;
}
public <T> T dispatch(NodeAnalyzer<T> analyzer) {
return analyzer.analyze(this);
}
}

@ -0,0 +1,29 @@
package chocopy.common.astnodes;
import chocopy.common.analysis.NodeAnalyzer;
import java_cup.runtime.ComplexSymbolFactory.Location;
import java.util.List;
/** For statements. */
public class ForStmt extends Stmt {
/** Control variable. */
public final Identifier identifier;
/** Source of values of control statement. */
public final Expr iterable;
/** Repeated statements. */
public final List<Stmt> body;
/** The AST for for IDENTIFIER in ITERABLE: BODY spanning source locations [LEFT..RIGHT]. */
public ForStmt(
Location left, Location right, Identifier identifier, Expr iterable, List<Stmt> body) {
super(left, right);
this.identifier = identifier;
this.iterable = iterable;
this.body = body;
}
public <T> T dispatch(NodeAnalyzer<T> analyzer) {
return analyzer.analyze(this);
}
}

@ -0,0 +1,50 @@
package chocopy.common.astnodes;
import chocopy.common.analysis.NodeAnalyzer;
import java_cup.runtime.ComplexSymbolFactory.Location;
import java.util.List;
/** Def statements. */
public class FuncDef extends Declaration {
/** Defined name. */
public final Identifier name;
/** Formal parameters. */
public final List<TypedVar> params;
/** Return type annotation. */
public final TypeAnnotation returnType;
/** Local-variable,inner-function, global, and nonlocal declarations. */
public final List<Declaration> declarations;
/** Other statements. */
public final List<Stmt> statements;
/**
* The AST for def NAME(PARAMS) -> RETURNTYPE: DECLARATIONS STATEMENTS spanning source locations
* [LEFT..RIGHT].
*/
public FuncDef(
Location left,
Location right,
Identifier name,
List<TypedVar> params,
TypeAnnotation returnType,
List<Declaration> declarations,
List<Stmt> statements) {
super(left, right);
this.name = name;
this.params = params;
this.returnType = returnType;
this.declarations = declarations;
this.statements = statements;
}
public <T> T dispatch(NodeAnalyzer<T> analyzer) {
return analyzer.analyze(this);
}
@Override
public Identifier getIdentifier() {
return this.name;
}
}

@ -0,0 +1,26 @@
package chocopy.common.astnodes;
import chocopy.common.analysis.NodeAnalyzer;
import java_cup.runtime.ComplexSymbolFactory.Location;
/** Declaration of global variable. */
public class GlobalDecl extends Declaration {
/** The declared variable. */
public final Identifier variable;
/** The AST for the declaration global VARIABLE spanning source locations [LEFT..RIGHT]. */
public GlobalDecl(Location left, Location right, Identifier variable) {
super(left, right);
this.variable = variable;
}
public <T> T dispatch(NodeAnalyzer<T> analyzer) {
return analyzer.analyze(this);
}
@Override
public Identifier getIdentifier() {
return this.variable;
}
}

@ -0,0 +1,24 @@
package chocopy.common.astnodes;
import chocopy.common.analysis.NodeAnalyzer;
import java_cup.runtime.ComplexSymbolFactory.Location;
/** A simple identifier. */
public class Identifier extends Expr {
/** Text of the identifier. */
public final String name;
/**
* An AST for the variable, method, or parameter named NAME, spanning source locations
* [LEFT..RIGHT].
*/
public Identifier(Location left, Location right, String name) {
super(left, right);
this.name = name;
}
public <T> T dispatch(NodeAnalyzer<T> analyzer) {
return analyzer.analyze(this);
}
}

@ -0,0 +1,26 @@
package chocopy.common.astnodes;
import chocopy.common.analysis.NodeAnalyzer;
import java_cup.runtime.ComplexSymbolFactory.Location;
/** Conditional expressions. */
public class IfExpr extends Expr {
/** Boolean condition. */
public final Expr condition;
/** True branch. */
public final Expr thenExpr;
/** False branch. */
public final Expr elseExpr;
/** The AST for THENEXPR if CONDITION else ELSEEXPR spanning source locations [LEFT..RIGHT]. */
public IfExpr(Location left, Location right, Expr condition, Expr thenExpr, Expr elseExpr) {
super(left, right);
this.condition = condition;
this.thenExpr = thenExpr;
this.elseExpr = elseExpr;
}
public <T> T dispatch(NodeAnalyzer<T> analyzer) {
return analyzer.analyze(this);
}
}

@ -0,0 +1,35 @@
package chocopy.common.astnodes;
import chocopy.common.analysis.NodeAnalyzer;
import java_cup.runtime.ComplexSymbolFactory.Location;
import java.util.List;
/** Conditional statement. */
public class IfStmt extends Stmt {
/** Test condition. */
public final Expr condition;
/** "True" branch. */
public final List<Stmt> thenBody;
/** "False" branch. */
public final List<Stmt> elseBody;
/**
* The AST for if CONDITION: THENBODY else: ELSEBODY spanning source locations [LEFT..RIGHT].
*/
public IfStmt(
Location left,
Location right,
Expr condition,
List<Stmt> thenBody,
List<Stmt> elseBody) {
super(left, right);
this.condition = condition;
this.thenBody = thenBody;
this.elseBody = elseBody;
}
public <T> T dispatch(NodeAnalyzer<T> analyzer) {
return analyzer.analyze(this);
}
}

@ -0,0 +1,24 @@
package chocopy.common.astnodes;
import chocopy.common.analysis.NodeAnalyzer;
import java_cup.runtime.ComplexSymbolFactory.Location;
/** List-indexing expression. */
public class IndexExpr extends Expr {
/** Indexed list. */
public final Expr list;
/** Expression for index value. */
public final Expr index;
/** The AST for LIST[INDEX]. spanning source locations [LEFT..RIGHT]. */
public IndexExpr(Location left, Location right, Expr list, Expr index) {
super(left, right);
this.list = list;
this.index = index;
}
public <T> T dispatch(NodeAnalyzer<T> analyzer) {
return analyzer.analyze(this);
}
}

@ -0,0 +1,21 @@
package chocopy.common.astnodes;
import chocopy.common.analysis.NodeAnalyzer;
import java_cup.runtime.ComplexSymbolFactory.Location;
/** Integer numerals. */
public final class IntegerLiteral extends Literal {
/** Value denoted. */
public final int value;
/** The AST for the literal VALUE, spanning source locations [LEFT..RIGHT]. */
public IntegerLiteral(Location left, Location right, int value) {
super(left, right);
this.value = value;
}
public <T> T dispatch(NodeAnalyzer<T> analyzer) {
return analyzer.analyze(this);
}
}

@ -0,0 +1,23 @@
package chocopy.common.astnodes;
import chocopy.common.analysis.NodeAnalyzer;
import java_cup.runtime.ComplexSymbolFactory.Location;
import java.util.List;
/** List displays. */
public final class ListExpr extends Expr {
/** List of element expressions. */
public final List<Expr> elements;
/** The AST for [ ELEMENTS ]. spanning source locations [LEFT..RIGHT]. */
public ListExpr(Location left, Location right, List<Expr> elements) {
super(left, right);
this.elements = elements;
}
public <T> T dispatch(NodeAnalyzer<T> analyzer) {
return analyzer.analyze(this);
}
}

@ -0,0 +1,21 @@
package chocopy.common.astnodes;
import chocopy.common.analysis.NodeAnalyzer;
import java_cup.runtime.ComplexSymbolFactory.Location;
/** Type denotation for a list type. */
public final class ListType extends TypeAnnotation {
/** The element of list element. */
public final TypeAnnotation elementType;
/** The AST for the type annotation [ ELEMENTTYPE ]. spanning source locations [LEFT..RIGHT]. */
public ListType(Location left, Location right, TypeAnnotation elementType) {
super(left, right);
this.elementType = elementType;
}
public <T> T dispatch(NodeAnalyzer<T> analyzer) {
return analyzer.analyze(this);
}
}

@ -0,0 +1,16 @@
package chocopy.common.astnodes;
import java_cup.runtime.ComplexSymbolFactory.Location;
/**
* Base of all the literal nodes.
*
* <p>There is nothing in this class, but it is useful to isolate expressions that are constant
* literals.
*/
public abstract class Literal extends Expr {
/** A literal spanning source locations [LEFT..RIGHT]. */
public Literal(Location left, Location right) {
super(left, right);
}
}

@ -0,0 +1,24 @@
package chocopy.common.astnodes;
import chocopy.common.analysis.NodeAnalyzer;
import java_cup.runtime.ComplexSymbolFactory.Location;
/** Attribute accessor. */
public class MemberExpr extends Expr {
/** Object selected from. */
public final Expr object;
/** Name of attribute (instance variable or method). */
public final Identifier member;
/** The AST for OBJECT.MEMBER. spanning source locations [LEFT..RIGHT]. */
public MemberExpr(Location left, Location right, Expr object, Identifier member) {
super(left, right);
this.object = object;
this.member = member;
}
public <T> T dispatch(NodeAnalyzer<T> analyzer) {
return analyzer.analyze(this);
}
}

@ -0,0 +1,26 @@
package chocopy.common.astnodes;
import chocopy.common.analysis.NodeAnalyzer;
import java_cup.runtime.ComplexSymbolFactory.Location;
import java.util.List;
/** Method calls. */
public class MethodCallExpr extends Expr {
/** Expression for the bound method to be called. */
public final MemberExpr method;
/** Actual parameters. */
public final List<Expr> args;
/** The AST for METHOD(ARGS). spanning source locations [LEFT..RIGHT]. */
public MethodCallExpr(Location left, Location right, MemberExpr method, List<Expr> args) {
super(left, right);
this.method = method;
this.args = args;
}
public <T> T dispatch(NodeAnalyzer<T> analyzer) {
return analyzer.analyze(this);
}
}

@ -0,0 +1,176 @@
package chocopy.common.astnodes;
import chocopy.common.analysis.NodeAnalyzer;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.module.paramnames.ParameterNamesModule;
import java_cup.runtime.ComplexSymbolFactory.Location;
import java.io.IOException;
/**
* Root of the AST class hierarchy. Every node has a left and right location, indicating the start
* and end of the represented construct in the source text.
*
* <p>Every node can be marked with an error message, which serves two purposes: 1. It indicates
* that an error message has been issued for this Node, allowing tne program to reduce cascades of
* error messages. 2. It aids in debugging by making it convenient to see which Nodes have caused an
* error.
*/
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.EXISTING_PROPERTY,
property = "kind")
/* List of all concrete subclasses of Node. */
@JsonSubTypes({
@JsonSubTypes.Type(AssignStmt.class),
@JsonSubTypes.Type(BinaryExpr.class),
@JsonSubTypes.Type(BooleanLiteral.class),
@JsonSubTypes.Type(CallExpr.class),
@JsonSubTypes.Type(ClassDef.class),
@JsonSubTypes.Type(ClassType.class),
@JsonSubTypes.Type(CompilerError.class),
@JsonSubTypes.Type(Errors.class),
@JsonSubTypes.Type(ExprStmt.class),
@JsonSubTypes.Type(ForStmt.class),
@JsonSubTypes.Type(FuncDef.class),
@JsonSubTypes.Type(GlobalDecl.class),
@JsonSubTypes.Type(Identifier.class),
@JsonSubTypes.Type(IfExpr.class),
@JsonSubTypes.Type(IfStmt.class),
@JsonSubTypes.Type(IndexExpr.class),
@JsonSubTypes.Type(IntegerLiteral.class),
@JsonSubTypes.Type(ListExpr.class),
@JsonSubTypes.Type(ListType.class),
@JsonSubTypes.Type(MemberExpr.class),
@JsonSubTypes.Type(MethodCallExpr.class),
@JsonSubTypes.Type(NoneLiteral.class),
@JsonSubTypes.Type(NonLocalDecl.class),
@JsonSubTypes.Type(Program.class),
@JsonSubTypes.Type(ReturnStmt.class),
@JsonSubTypes.Type(StringLiteral.class),
@JsonSubTypes.Type(TypedVar.class),
@JsonSubTypes.Type(UnaryExpr.class),
@JsonSubTypes.Type(VarDef.class),
@JsonSubTypes.Type(WhileStmt.class),
})
public abstract class Node {
/** Node-type indicator for JSON form. */
public final String kind;
/**
* Source position information: 0: line number of start, 1: column number of start, 2: line
* number of end, 3: column number of end.
*/
private final int[] location = new int[4];
/**
* First error message "blamed" on this Node. When non-null, indicates that an error has been
* found in this Node.
*/
@JsonInclude(JsonInclude.Include.NON_EMPTY)
private String errorMsg;
/** A Node corresponding to source text between LEFT and RIGHT. */
public Node(Location left, Location right) {
if (left != null) {
location[0] = left.getLine();
location[1] = left.getColumn();
}
if (right != null) {
location[2] = right.getLine();
location[3] = right.getColumn();
}
this.kind = getClass().getSimpleName();
this.errorMsg = null;
}
/**
* Return my source location as { <first line>, <first column>, <last line>, <last column> }.
* Result should not be modified, and contents will change after setLocation().
*/
public int[] getLocation() {
return location;
}
/** Copy LOCATION as getLocation(). */
public void setLocation(final int[] location) {
System.arraycopy(location, 0, this.location, 0, 4);
}
public String getErrorMsg() {
return errorMsg;
}
public void setErrorMsg(String msg) {
this.errorMsg = msg;
}
/** Return true iff I have been marked with an error message. */
@JsonIgnore
public boolean hasError() {
return this.errorMsg != null;
}
/**
* Invoke ANALYZER on me as a node of static type T. See the comment on NodeAnalyzer. Returns
* modified Node.
*/
public abstract <T> T dispatch(NodeAnalyzer<T> analyzer);
/** Print out the AST in JSON format. */
@Override
public String toString() {
try {
return toJSON();
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
/** Return a serialization of this node in JSON format. */
public String toJSON() throws JsonProcessingException {
return mapper.writeValueAsString(this);
}
/** Mapper to-and-from serialized JSON. */
private static final ObjectMapper mapper = new ObjectMapper();
static {
mapper.enable(SerializationFeature.INDENT_OUTPUT);
mapper.registerModule(new ParameterNamesModule());
}
/** Returns a T from JSON, a JSON-serialized T value with class CLAS. */
public static <T> T fromJSON(String json, Class<T> clas) throws IOException {
return mapper.readValue(json, clas);
}
/**
* Returns the result of converting JSON, a JSon-serialization of a Node value, into the value
* it serializes.
*/
public static Node fromJSON(String json) throws IOException {
return fromJSON(json, Node.class);
}
/**
* Returns the result of converting TREE to the value of type T that it represents, where CLAS
* reflects T.
*/
public static <T> T fromJSON(JsonNode tree, Class<T> clas) throws IOException {
return mapper.treeToValue(tree, clas);
}
/** Returns the translation of serialized value SRC into the corresponding JSON tree. */
public static JsonNode readTree(String src) throws IOException {
return mapper.readTree(src);
}
}

@ -0,0 +1,26 @@
package chocopy.common.astnodes;
import chocopy.common.analysis.NodeAnalyzer;
import java_cup.runtime.ComplexSymbolFactory.Location;
/** Nonlocal declaration. */
public class NonLocalDecl extends Declaration {
/** Name of identifier being declared. */
public final Identifier variable;
/** The AST for nonlocal VARIABLE spanning source locations [LEFT..RIGHT]. */
public NonLocalDecl(Location left, Location right, Identifier variable) {
super(left, right);
this.variable = variable;
}
public <T> T dispatch(NodeAnalyzer<T> analyzer) {
return analyzer.analyze(this);
}
@Override
public Identifier getIdentifier() {
return this.variable;
}
}

@ -0,0 +1,17 @@
package chocopy.common.astnodes;
import chocopy.common.analysis.NodeAnalyzer;
import java_cup.runtime.ComplexSymbolFactory.Location;
/** The expression 'None'. */
public final class NoneLiteral extends Literal {
/** The AST for None, spanning source locations [LEFT..RIGHT]. */
public NoneLiteral(Location left, Location right) {
super(left, right);
}
public <T> T dispatch(NodeAnalyzer<T> analyzer) {
return analyzer.analyze(this);
}
}

@ -0,0 +1,56 @@
package chocopy.common.astnodes;
import chocopy.common.analysis.NodeAnalyzer;
import com.fasterxml.jackson.annotation.JsonIgnore;
import java_cup.runtime.ComplexSymbolFactory.Location;
import java.util.ArrayList;
import java.util.List;
/** An entire Chocopy program. */
public class Program extends Node {
/** Initial variable, class, and function declarations. */
public final List<Declaration> declarations;
/** Trailing statements. */
public final List<Stmt> statements;
/** Accumulated errors. */
public final Errors errors;
/**
* The AST for the program DECLARATIONS STATEMENTS spanning source locations [LEFT..RIGHT].
*
* <p>ERRORS is the container for all error messages applying to the program.
*/
public Program(
Location left,
Location right,
List<Declaration> declarations,
List<Stmt> statements,
Errors errors) {
super(left, right);
this.declarations = declarations;
this.statements = statements;
if (errors == null) {
this.errors = new Errors(new ArrayList<>());
} else {
this.errors = errors;
}
}
public <T> T dispatch(NodeAnalyzer<T> analyzer) {
return analyzer.analyze(this);
}
/** Returns true iff there is at least one error in the program. */
@JsonIgnore
public boolean hasErrors() {
return errors.hasErrors();
}
/** A convenience method returning the list of all CompilerErrors for this program. */
@JsonIgnore
public List<CompilerError> getErrorList() {
return errors.errors;
}
}

@ -0,0 +1,21 @@
package chocopy.common.astnodes;
import chocopy.common.analysis.NodeAnalyzer;
import java_cup.runtime.ComplexSymbolFactory.Location;
/** Return from function. */
public class ReturnStmt extends Stmt {
/** Returned value. */
public final Expr value;
/** The AST for return VALUE spanning source locations [LEFT..RIGHT]. */
public ReturnStmt(Location left, Location right, Expr value) {
super(left, right);
this.value = value;
}
public <T> T dispatch(NodeAnalyzer<T> analyzer) {
return analyzer.analyze(this);
}
}

@ -0,0 +1,18 @@
package chocopy.common.astnodes;
import java_cup.runtime.ComplexSymbolFactory.Location;
/**
* Base of all AST nodes representing statements.
*
* <p>There is nothing in this class, but there will be some AST node types that have fields that
* are *any statement* or a list of statements. For those cases, having a field of this type will
* encompass all types of statements such as expression statements, if statements, while statements,
* etc.
*/
public abstract class Stmt extends Node {
/** A statement spanning source locations [LEFT..RIGHT]. */
public Stmt(Location left, Location right) {
super(left, right);
}
}

@ -0,0 +1,21 @@
package chocopy.common.astnodes;
import chocopy.common.analysis.NodeAnalyzer;
import java_cup.runtime.ComplexSymbolFactory.Location;
/** String constants. */
public final class StringLiteral extends Literal {
/** Contents of the literal, not including quotation marks. */
public final String value;
/** The AST for a string literal containing VALUE, spanning source locations [LEFT..RIGHT]. */
public StringLiteral(Location left, Location right, String value) {
super(left, right);
this.value = value;
}
public <T> T dispatch(NodeAnalyzer<T> analyzer) {
return analyzer.analyze(this);
}
}

@ -0,0 +1,11 @@
package chocopy.common.astnodes;
import java_cup.runtime.ComplexSymbolFactory.Location;
/** Base of all AST nodes representing type annotations (list or class types. */
public abstract class TypeAnnotation extends Node {
/** An annotation spanning source locations [LEFT..RIGHT]. */
public TypeAnnotation(Location left, Location right) {
super(left, right);
}
}

@ -0,0 +1,24 @@
package chocopy.common.astnodes;
import chocopy.common.analysis.NodeAnalyzer;
import java_cup.runtime.ComplexSymbolFactory.Location;
/** An identifier with attached type annotation. */
public class TypedVar extends Node {
/** The typed identifier. */
public final Identifier identifier;
/** The declared type. */
public final TypeAnnotation type;
/** The AST for IDENTIFIER : TYPE. spanning source locations [LEFT..RIGHT]. */
public TypedVar(Location left, Location right, Identifier identifier, TypeAnnotation type) {
super(left, right);
this.identifier = identifier;
this.type = type;
}
public <T> T dispatch(NodeAnalyzer<T> analyzer) {
return analyzer.analyze(this);
}
}

@ -0,0 +1,24 @@
package chocopy.common.astnodes;
import chocopy.common.analysis.NodeAnalyzer;
import java_cup.runtime.ComplexSymbolFactory.Location;
/** An expression applying a unary operator. */
public class UnaryExpr extends Expr {
/** The text representation of the operator. */
public final String operator;
/** The operand to which it is applied. */
public final Expr operand;
/** The AST for OPERATOR OPERAND spanning source locations [LEFT..RIGHT]. */
public UnaryExpr(Location left, Location right, String operator, Expr operand) {
super(left, right);
this.operator = operator;
this.operand = operand;
}
public <T> T dispatch(NodeAnalyzer<T> analyzer) {
return analyzer.analyze(this);
}
}

@ -0,0 +1,32 @@
package chocopy.common.astnodes;
import chocopy.common.analysis.NodeAnalyzer;
import java_cup.runtime.ComplexSymbolFactory.Location;
/** A declaration of a variable (i.e., with type annotation). */
public class VarDef extends Declaration {
/** The variable and its assigned type. */
public final TypedVar var;
/** The initial value assigned. */
public final Literal value;
/**
* The AST for VAR = VALUE where VAR has a type annotation, and spanning source locations
* [LEFT..RIGHT].
*/
public VarDef(Location left, Location right, TypedVar var, Literal value) {
super(left, right);
this.var = var;
this.value = value;
}
public <T> T dispatch(NodeAnalyzer<T> analyzer) {
return analyzer.analyze(this);
}
/** The identifier defined by this declaration. */
@Override
public Identifier getIdentifier() {
return this.var.identifier;
}
}

@ -0,0 +1,25 @@
package chocopy.common.astnodes;
import chocopy.common.analysis.NodeAnalyzer;
import java_cup.runtime.ComplexSymbolFactory.Location;
import java.util.List;
/** Indefinite repetition construct. */
public class WhileStmt extends Stmt {
/** Test for whether to continue. */
public final Expr condition;
/** Loop body. */
public final List<Stmt> body;
/** The AST for while CONDITION: BODY spanning source locations [LEFT..RIGHT]. */
public WhileStmt(Location left, Location right, Expr condition, List<Stmt> body) {
super(left, right);
this.condition = condition;
this.body = body;
}
public <T> T dispatch(NodeAnalyzer<T> analyzer) {
return analyzer.analyze(this);
}
}

@ -0,0 +1,55 @@
package chocopy.pa2;
import chocopy.common.analysis.AbstractNodeAnalyzer;
import chocopy.common.analysis.SymbolTable;
import chocopy.common.analysis.types.Type;
import chocopy.common.analysis.types.ValueType;
import chocopy.common.astnodes.*;
/** Analyzes declarations to create a top-level symbol table. */
public class DeclarationAnalyzer extends AbstractNodeAnalyzer<Type> {
/** Current symbol table. Changes with new declarative region. */
private final SymbolTable<Type> sym = new SymbolTable<>();
/** Global symbol table. */
private final SymbolTable<Type> globals = sym;
/** Receiver for semantic error messages. */
private final Errors errors;
/** A new declaration analyzer sending errors to ERRORS0. */
public DeclarationAnalyzer(Errors errors0) {
errors = errors0;
}
public SymbolTable<Type> getGlobals() {
return globals;
}
@Override
public Type analyze(Program program) {
for (Declaration decl : program.declarations) {
Identifier id = decl.getIdentifier();
String name = id.name;
Type type = decl.dispatch(this);
if (type == null) {
continue;
}
if (sym.declares(name)) {
errors.semError(
id, "Duplicate declaration of identifier in same " + "scope: %s", name);
} else {
sym.put(name, type);
}
}
return null;
}
@Override
public Type analyze(VarDef varDef) {
return ValueType.annotationToValueType(varDef.var.type);
}
}

@ -0,0 +1,30 @@
package chocopy.pa2;
import chocopy.common.analysis.SymbolTable;
import chocopy.common.analysis.types.Type;
import chocopy.common.astnodes.Program;
/** Top-level class for performing semantic analysis. */
public class StudentAnalysis {
/**
* Perform semantic analysis on PROGRAM, adding error messages and type annotations. Provide
* debugging output iff DEBUG. Returns modified tree.
*/
public static Program process(Program program, boolean debug) {
if (program.hasErrors()) {
return program;
}
DeclarationAnalyzer declarationAnalyzer = new DeclarationAnalyzer(program.errors);
program.dispatch(declarationAnalyzer);
SymbolTable<Type> globalSym = declarationAnalyzer.getGlobals();
if (!program.hasErrors()) {
TypeChecker typeChecker = new TypeChecker(globalSym, program.errors);
program.dispatch(typeChecker);
}
return program;
}
}

@ -0,0 +1,94 @@
package chocopy.pa2;
import chocopy.common.analysis.AbstractNodeAnalyzer;
import chocopy.common.analysis.SymbolTable;
import chocopy.common.analysis.types.Type;
import chocopy.common.analysis.types.ValueType;
import chocopy.common.astnodes.*;
import static chocopy.common.analysis.types.Type.INT_TYPE;
import static chocopy.common.analysis.types.Type.OBJECT_TYPE;
/**
* Analyzer that performs ChocoPy type checks on all nodes. Applied after collecting declarations.
*/
public class TypeChecker extends AbstractNodeAnalyzer<Type> {
/** The current symbol table (changes depending on the function being analyzed). */
private final SymbolTable<Type> sym;
/** Collector for errors. */
private final Errors errors;
/**
* Creates a type checker using GLOBALSYMBOLS for the initial global symbol table and ERRORS0 to
* receive semantic errors.
*/
public TypeChecker(SymbolTable<Type> globalSymbols, Errors errors0) {
sym = globalSymbols;
errors = errors0;
}
/**
* Inserts an error message in NODE if there isn't one already. The message is constructed with
* MESSAGE and ARGS as for String.format.
*/
private void err(Node node, String message, Object... args) {
errors.semError(node, message, args);
}
@Override
public Type analyze(Program program) {
for (Declaration decl : program.declarations) {
decl.dispatch(this);
}
for (Stmt stmt : program.statements) {
stmt.dispatch(this);
}
return null;
}
@Override
public Type analyze(ExprStmt s) {
s.expr.dispatch(this);
return null;
}
@Override
public Type analyze(IntegerLiteral i) {
return i.setInferredType(Type.INT_TYPE);
}
@Override
public Type analyze(BinaryExpr e) {
Type t1 = e.left.dispatch(this);
Type t2 = e.right.dispatch(this);
switch (e.operator) {
case "-":
case "*":
case "//":
case "%":
if (INT_TYPE.equals(t1) && INT_TYPE.equals(t2)) {
return e.setInferredType(INT_TYPE);
} else {
err(e, "Cannot apply operator `%s` on types `%s` and `%s`", e.operator, t1, t2);
return e.setInferredType(INT_TYPE);
}
default:
return e.setInferredType(OBJECT_TYPE);
}
}
@Override
public Type analyze(Identifier id) {
String varName = id.name;
Type varType = sym.get(varName);
if (varType != null && varType.isValueType()) {
return id.setInferredType(varType);
}
err(id, "Not a variable: %s", varName);
return id.setInferredType(ValueType.OBJECT_TYPE);
}
}

@ -0,0 +1,38 @@
count:int = 0
def foo(s: str) -> int:
return len(s)
class bar(object):
p: bool = True
def baz(self:"bar", xx: [int]) -> str:
global count
x:int = 0
y:int = 1
def qux(y: int) -> object:
nonlocal x
if x > y:
x = -1
for x in xx:
self.p = x == 2
qux(0) # Yay! ChocoPy
count = count + 1
while x <= 0:
if self.p:
xx[0] = xx[1]
self.p = not self.p
x = x + 1
elif foo("Long"[0]) == 1:
self.p = self is None
return "Nope"
print(bar().baz([1,2]))

@ -0,0 +1,627 @@
{
"kind" : "Program",
"location" : [ 1, 1, 36, 24 ],
"declarations" : [ {
"kind" : "VarDef",
"location" : [ 1, 1, 1, 13 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 1, 1, 1, 9 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 1, 1, 1, 5 ],
"name" : "count"
},
"type" : {
"kind" : "ClassType",
"location" : [ 1, 7, 1, 9 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 1, 13, 1, 13 ],
"value" : 0
}
}, {
"kind" : "FuncDef",
"location" : [ 3, 1, 4, 18 ],
"name" : {
"kind" : "Identifier",
"location" : [ 3, 5, 3, 7 ],
"name" : "foo"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 3, 9, 3, 14 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 3, 9, 3, 9 ],
"name" : "s"
},
"type" : {
"kind" : "ClassType",
"location" : [ 3, 12, 3, 14 ],
"className" : "str"
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 3, 20, 3, 22 ],
"className" : "int"
},
"declarations" : [ ],
"statements" : [ {
"kind" : "ReturnStmt",
"location" : [ 4, 5, 4, 17 ],
"value" : {
"kind" : "CallExpr",
"location" : [ 4, 12, 4, 17 ],
"function" : {
"kind" : "Identifier",
"location" : [ 4, 12, 4, 14 ],
"name" : "len"
},
"args" : [ {
"kind" : "Identifier",
"location" : [ 4, 16, 4, 16 ],
"name" : "s"
} ]
}
} ]
}, {
"kind" : "ClassDef",
"location" : [ 6, 1, 36, 0 ],
"name" : {
"kind" : "Identifier",
"location" : [ 6, 7, 6, 9 ],
"name" : "bar"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 6, 11, 6, 16 ],
"name" : "object"
},
"declarations" : [ {
"kind" : "VarDef",
"location" : [ 7, 5, 7, 18 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 7, 5, 7, 11 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 7, 5, 7, 5 ],
"name" : "p"
},
"type" : {
"kind" : "ClassType",
"location" : [ 7, 8, 7, 11 ],
"className" : "bool"
}
},
"value" : {
"kind" : "BooleanLiteral",
"location" : [ 7, 15, 7, 18 ],
"value" : true
}
}, {
"kind" : "FuncDef",
"location" : [ 9, 5, 34, 22 ],
"name" : {
"kind" : "Identifier",
"location" : [ 9, 9, 9, 11 ],
"name" : "baz"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 9, 13, 9, 22 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 9, 13, 9, 16 ],
"name" : "self"
},
"type" : {
"kind" : "ClassType",
"location" : [ 9, 18, 9, 22 ],
"className" : "bar"
}
}, {
"kind" : "TypedVar",
"location" : [ 9, 25, 9, 33 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 9, 25, 9, 26 ],
"name" : "xx"
},
"type" : {
"kind" : "ListType",
"location" : [ 9, 29, 9, 33 ],
"elementType" : {
"kind" : "ClassType",
"location" : [ 9, 30, 9, 32 ],
"className" : "int"
}
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 9, 39, 9, 41 ],
"className" : "str"
},
"declarations" : [ {
"kind" : "GlobalDecl",
"location" : [ 10, 9, 10, 20 ],
"variable" : {
"kind" : "Identifier",
"location" : [ 10, 16, 10, 20 ],
"name" : "count"
}
}, {
"kind" : "VarDef",
"location" : [ 11, 9, 11, 17 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 11, 9, 11, 13 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 11, 9, 11, 9 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 11, 11, 11, 13 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 11, 17, 11, 17 ],
"value" : 0
}
}, {
"kind" : "VarDef",
"location" : [ 12, 9, 12, 17 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 12, 9, 12, 13 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 12, 9, 12, 9 ],
"name" : "y"
},
"type" : {
"kind" : "ClassType",
"location" : [ 12, 11, 12, 13 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 12, 17, 12, 17 ],
"value" : 1
}
}, {
"kind" : "FuncDef",
"location" : [ 14, 9, 19, 8 ],
"name" : {
"kind" : "Identifier",
"location" : [ 14, 13, 14, 15 ],
"name" : "qux"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 14, 17, 14, 22 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 14, 17, 14, 17 ],
"name" : "y"
},
"type" : {
"kind" : "ClassType",
"location" : [ 14, 20, 14, 22 ],
"className" : "int"
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 14, 28, 14, 33 ],
"className" : "object"
},
"declarations" : [ {
"kind" : "NonLocalDecl",
"location" : [ 15, 13, 15, 22 ],
"variable" : {
"kind" : "Identifier",
"location" : [ 15, 22, 15, 22 ],
"name" : "x"
}
} ],
"statements" : [ {
"kind" : "IfStmt",
"location" : [ 16, 13, 19, 8 ],
"condition" : {
"kind" : "BinaryExpr",
"location" : [ 16, 16, 16, 20 ],
"left" : {
"kind" : "Identifier",
"location" : [ 16, 16, 16, 16 ],
"name" : "x"
},
"operator" : ">",
"right" : {
"kind" : "Identifier",
"location" : [ 16, 20, 16, 20 ],
"name" : "y"
}
},
"thenBody" : [ {
"kind" : "AssignStmt",
"location" : [ 17, 17, 17, 22 ],
"targets" : [ {
"kind" : "Identifier",
"location" : [ 17, 17, 17, 17 ],
"name" : "x"
} ],
"value" : {
"kind" : "UnaryExpr",
"location" : [ 17, 21, 17, 22 ],
"operator" : "-",
"operand" : {
"kind" : "IntegerLiteral",
"location" : [ 17, 22, 17, 22 ],
"value" : 1
}
}
} ],
"elseBody" : [ ]
} ]
} ],
"statements" : [ {
"kind" : "ForStmt",
"location" : [ 19, 9, 22, 8 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 19, 13, 19, 13 ],
"name" : "x"
},
"iterable" : {
"kind" : "Identifier",
"location" : [ 19, 18, 19, 19 ],
"name" : "xx"
},
"body" : [ {
"kind" : "AssignStmt",
"location" : [ 20, 13, 20, 27 ],
"targets" : [ {
"kind" : "MemberExpr",
"location" : [ 20, 13, 20, 18 ],
"object" : {
"kind" : "Identifier",
"location" : [ 20, 13, 20, 16 ],
"name" : "self"
},
"member" : {
"kind" : "Identifier",
"location" : [ 20, 18, 20, 18 ],
"name" : "p"
}
} ],
"value" : {
"kind" : "BinaryExpr",
"location" : [ 20, 22, 20, 27 ],
"left" : {
"kind" : "Identifier",
"location" : [ 20, 22, 20, 22 ],
"name" : "x"
},
"operator" : "==",
"right" : {
"kind" : "IntegerLiteral",
"location" : [ 20, 27, 20, 27 ],
"value" : 2
}
}
} ]
}, {
"kind" : "ExprStmt",
"location" : [ 22, 9, 22, 14 ],
"expr" : {
"kind" : "CallExpr",
"location" : [ 22, 9, 22, 14 ],
"function" : {
"kind" : "Identifier",
"location" : [ 22, 9, 22, 11 ],
"name" : "qux"
},
"args" : [ {
"kind" : "IntegerLiteral",
"location" : [ 22, 13, 22, 13 ],
"value" : 0
} ]
}
}, {
"kind" : "AssignStmt",
"location" : [ 24, 9, 24, 25 ],
"targets" : [ {
"kind" : "Identifier",
"location" : [ 24, 9, 24, 13 ],
"name" : "count"
} ],
"value" : {
"kind" : "BinaryExpr",
"location" : [ 24, 17, 24, 25 ],
"left" : {
"kind" : "Identifier",
"location" : [ 24, 17, 24, 21 ],
"name" : "count"
},
"operator" : "+",
"right" : {
"kind" : "IntegerLiteral",
"location" : [ 24, 25, 24, 25 ],
"value" : 1
}
}
}, {
"kind" : "WhileStmt",
"location" : [ 26, 9, 34, 8 ],
"condition" : {
"kind" : "BinaryExpr",
"location" : [ 26, 15, 26, 20 ],
"left" : {
"kind" : "Identifier",
"location" : [ 26, 15, 26, 15 ],
"name" : "x"
},
"operator" : "<=",
"right" : {
"kind" : "IntegerLiteral",
"location" : [ 26, 20, 26, 20 ],
"value" : 0
}
},
"body" : [ {
"kind" : "IfStmt",
"location" : [ 27, 13, 34, 8 ],
"condition" : {
"kind" : "MemberExpr",
"location" : [ 27, 16, 27, 21 ],
"object" : {
"kind" : "Identifier",
"location" : [ 27, 16, 27, 19 ],
"name" : "self"
},
"member" : {
"kind" : "Identifier",
"location" : [ 27, 21, 27, 21 ],
"name" : "p"
}
},
"thenBody" : [ {
"kind" : "AssignStmt",
"location" : [ 28, 17, 28, 29 ],
"targets" : [ {
"kind" : "IndexExpr",
"location" : [ 28, 17, 28, 21 ],
"list" : {
"kind" : "Identifier",
"location" : [ 28, 17, 28, 18 ],
"name" : "xx"
},
"index" : {
"kind" : "IntegerLiteral",
"location" : [ 28, 20, 28, 20 ],
"value" : 0
}
} ],
"value" : {
"kind" : "IndexExpr",
"location" : [ 28, 25, 28, 29 ],
"list" : {
"kind" : "Identifier",
"location" : [ 28, 25, 28, 26 ],
"name" : "xx"
},
"index" : {
"kind" : "IntegerLiteral",
"location" : [ 28, 28, 28, 28 ],
"value" : 1
}
}
}, {
"kind" : "AssignStmt",
"location" : [ 29, 17, 29, 35 ],
"targets" : [ {
"kind" : "MemberExpr",
"location" : [ 29, 17, 29, 22 ],
"object" : {
"kind" : "Identifier",
"location" : [ 29, 17, 29, 20 ],
"name" : "self"
},
"member" : {
"kind" : "Identifier",
"location" : [ 29, 22, 29, 22 ],
"name" : "p"
}
} ],
"value" : {
"kind" : "UnaryExpr",
"location" : [ 29, 26, 29, 35 ],
"operator" : "not",
"operand" : {
"kind" : "MemberExpr",
"location" : [ 29, 30, 29, 35 ],
"object" : {
"kind" : "Identifier",
"location" : [ 29, 30, 29, 33 ],
"name" : "self"
},
"member" : {
"kind" : "Identifier",
"location" : [ 29, 35, 29, 35 ],
"name" : "p"
}
}
}
}, {
"kind" : "AssignStmt",
"location" : [ 30, 17, 30, 25 ],
"targets" : [ {
"kind" : "Identifier",
"location" : [ 30, 17, 30, 17 ],
"name" : "x"
} ],
"value" : {
"kind" : "BinaryExpr",
"location" : [ 30, 21, 30, 25 ],
"left" : {
"kind" : "Identifier",
"location" : [ 30, 21, 30, 21 ],
"name" : "x"
},
"operator" : "+",
"right" : {
"kind" : "IntegerLiteral",
"location" : [ 30, 25, 30, 25 ],
"value" : 1
}
}
} ],
"elseBody" : [ {
"kind" : "IfStmt",
"location" : [ 31, 13, 34, 8 ],
"condition" : {
"kind" : "BinaryExpr",
"location" : [ 31, 18, 31, 36 ],
"left" : {
"kind" : "CallExpr",
"location" : [ 31, 18, 31, 31 ],
"function" : {
"kind" : "Identifier",
"location" : [ 31, 18, 31, 20 ],
"name" : "foo"
},
"args" : [ {
"kind" : "IndexExpr",
"location" : [ 31, 22, 31, 30 ],
"list" : {
"kind" : "StringLiteral",
"location" : [ 31, 22, 31, 27 ],
"value" : "Long"
},
"index" : {
"kind" : "IntegerLiteral",
"location" : [ 31, 29, 31, 29 ],
"value" : 0
}
} ]
},
"operator" : "==",
"right" : {
"kind" : "IntegerLiteral",
"location" : [ 31, 36, 31, 36 ],
"value" : 1
}
},
"thenBody" : [ {
"kind" : "AssignStmt",
"location" : [ 32, 17, 32, 37 ],
"targets" : [ {
"kind" : "MemberExpr",
"location" : [ 32, 17, 32, 22 ],
"object" : {
"kind" : "Identifier",
"location" : [ 32, 17, 32, 20 ],
"name" : "self"
},
"member" : {
"kind" : "Identifier",
"location" : [ 32, 22, 32, 22 ],
"name" : "p"
}
} ],
"value" : {
"kind" : "BinaryExpr",
"location" : [ 32, 26, 32, 37 ],
"left" : {
"kind" : "Identifier",
"location" : [ 32, 26, 32, 29 ],
"name" : "self"
},
"operator" : "is",
"right" : {
"kind" : "NoneLiteral",
"location" : [ 32, 34, 32, 37 ]
}
}
} ],
"elseBody" : [ ]
} ]
} ]
}, {
"kind" : "ReturnStmt",
"location" : [ 34, 9, 34, 21 ],
"value" : {
"kind" : "StringLiteral",
"location" : [ 34, 16, 34, 21 ],
"value" : "Nope"
}
} ]
} ]
} ],
"statements" : [ {
"kind" : "ExprStmt",
"location" : [ 36, 1, 36, 23 ],
"expr" : {
"kind" : "CallExpr",
"location" : [ 36, 1, 36, 23 ],
"function" : {
"kind" : "Identifier",
"location" : [ 36, 1, 36, 5 ],
"name" : "print"
},
"args" : [ {
"kind" : "MethodCallExpr",
"location" : [ 36, 7, 36, 22 ],
"method" : {
"kind" : "MemberExpr",
"location" : [ 36, 7, 36, 15 ],
"object" : {
"kind" : "CallExpr",
"location" : [ 36, 7, 36, 11 ],
"function" : {
"kind" : "Identifier",
"location" : [ 36, 7, 36, 9 ],
"name" : "bar"
},
"args" : [ ]
},
"member" : {
"kind" : "Identifier",
"location" : [ 36, 13, 36, 15 ],
"name" : "baz"
}
},
"args" : [ {
"kind" : "ListExpr",
"location" : [ 36, 17, 36, 21 ],
"elements" : [ {
"kind" : "IntegerLiteral",
"location" : [ 36, 18, 36, 18 ],
"value" : 1
}, {
"kind" : "IntegerLiteral",
"location" : [ 36, 20, 36, 20 ],
"value" : 2
} ]
} ]
} ]
}
} ],
"errors" : {
"errors" : [ ],
"kind" : "Errors",
"location" : [ 0, 0, 0, 0 ]
}
}

@ -0,0 +1,952 @@
{
"kind" : "Program",
"location" : [ 1, 1, 36, 24 ],
"declarations" : [ {
"kind" : "VarDef",
"location" : [ 1, 1, 1, 13 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 1, 1, 1, 9 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 1, 1, 1, 5 ],
"name" : "count"
},
"type" : {
"kind" : "ClassType",
"location" : [ 1, 7, 1, 9 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 1, 13, 1, 13 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"value" : 0
}
}, {
"kind" : "FuncDef",
"location" : [ 3, 1, 4, 18 ],
"name" : {
"kind" : "Identifier",
"location" : [ 3, 5, 3, 7 ],
"name" : "foo"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 3, 9, 3, 14 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 3, 9, 3, 9 ],
"name" : "s"
},
"type" : {
"kind" : "ClassType",
"location" : [ 3, 12, 3, 14 ],
"className" : "str"
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 3, 20, 3, 22 ],
"className" : "int"
},
"declarations" : [ ],
"statements" : [ {
"kind" : "ReturnStmt",
"location" : [ 4, 5, 4, 17 ],
"value" : {
"kind" : "CallExpr",
"location" : [ 4, 12, 4, 17 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"function" : {
"kind" : "Identifier",
"location" : [ 4, 12, 4, 14 ],
"inferredType" : {
"kind" : "FuncType",
"parameters" : [ {
"kind" : "ClassValueType",
"className" : "object"
} ],
"returnType" : {
"kind" : "ClassValueType",
"className" : "int"
}
},
"name" : "len"
},
"args" : [ {
"kind" : "Identifier",
"location" : [ 4, 16, 4, 16 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "str"
},
"name" : "s"
} ]
}
} ]
}, {
"kind" : "ClassDef",
"location" : [ 6, 1, 36, 0 ],
"name" : {
"kind" : "Identifier",
"location" : [ 6, 7, 6, 9 ],
"name" : "bar"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 6, 11, 6, 16 ],
"name" : "object"
},
"declarations" : [ {
"kind" : "VarDef",
"location" : [ 7, 5, 7, 18 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 7, 5, 7, 11 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 7, 5, 7, 5 ],
"name" : "p"
},
"type" : {
"kind" : "ClassType",
"location" : [ 7, 8, 7, 11 ],
"className" : "bool"
}
},
"value" : {
"kind" : "BooleanLiteral",
"location" : [ 7, 15, 7, 18 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "bool"
},
"value" : true
}
}, {
"kind" : "FuncDef",
"location" : [ 9, 5, 34, 22 ],
"name" : {
"kind" : "Identifier",
"location" : [ 9, 9, 9, 11 ],
"name" : "baz"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 9, 13, 9, 22 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 9, 13, 9, 16 ],
"name" : "self"
},
"type" : {
"kind" : "ClassType",
"location" : [ 9, 18, 9, 22 ],
"className" : "bar"
}
}, {
"kind" : "TypedVar",
"location" : [ 9, 25, 9, 33 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 9, 25, 9, 26 ],
"name" : "xx"
},
"type" : {
"kind" : "ListType",
"location" : [ 9, 29, 9, 33 ],
"elementType" : {
"kind" : "ClassType",
"location" : [ 9, 30, 9, 32 ],
"className" : "int"
}
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 9, 39, 9, 41 ],
"className" : "str"
},
"declarations" : [ {
"kind" : "GlobalDecl",
"location" : [ 10, 9, 10, 20 ],
"variable" : {
"kind" : "Identifier",
"location" : [ 10, 16, 10, 20 ],
"name" : "count"
}
}, {
"kind" : "VarDef",
"location" : [ 11, 9, 11, 17 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 11, 9, 11, 13 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 11, 9, 11, 9 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 11, 11, 11, 13 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 11, 17, 11, 17 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"value" : 0
}
}, {
"kind" : "VarDef",
"location" : [ 12, 9, 12, 17 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 12, 9, 12, 13 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 12, 9, 12, 9 ],
"name" : "y"
},
"type" : {
"kind" : "ClassType",
"location" : [ 12, 11, 12, 13 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 12, 17, 12, 17 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"value" : 1
}
}, {
"kind" : "FuncDef",
"location" : [ 14, 9, 19, 8 ],
"name" : {
"kind" : "Identifier",
"location" : [ 14, 13, 14, 15 ],
"name" : "qux"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 14, 17, 14, 22 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 14, 17, 14, 17 ],
"name" : "y"
},
"type" : {
"kind" : "ClassType",
"location" : [ 14, 20, 14, 22 ],
"className" : "int"
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 14, 28, 14, 33 ],
"className" : "object"
},
"declarations" : [ {
"kind" : "NonLocalDecl",
"location" : [ 15, 13, 15, 22 ],
"variable" : {
"kind" : "Identifier",
"location" : [ 15, 22, 15, 22 ],
"name" : "x"
}
} ],
"statements" : [ {
"kind" : "IfStmt",
"location" : [ 16, 13, 19, 8 ],
"condition" : {
"kind" : "BinaryExpr",
"location" : [ 16, 16, 16, 20 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "bool"
},
"left" : {
"kind" : "Identifier",
"location" : [ 16, 16, 16, 16 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"name" : "x"
},
"operator" : ">",
"right" : {
"kind" : "Identifier",
"location" : [ 16, 20, 16, 20 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"name" : "y"
}
},
"thenBody" : [ {
"kind" : "AssignStmt",
"location" : [ 17, 17, 17, 22 ],
"targets" : [ {
"kind" : "Identifier",
"location" : [ 17, 17, 17, 17 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"name" : "x"
} ],
"value" : {
"kind" : "UnaryExpr",
"location" : [ 17, 21, 17, 22 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"operator" : "-",
"operand" : {
"kind" : "IntegerLiteral",
"location" : [ 17, 22, 17, 22 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"value" : 1
}
}
} ],
"elseBody" : [ ]
} ]
} ],
"statements" : [ {
"kind" : "ForStmt",
"location" : [ 19, 9, 22, 8 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 19, 13, 19, 13 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"name" : "x"
},
"iterable" : {
"kind" : "Identifier",
"location" : [ 19, 18, 19, 19 ],
"inferredType" : {
"kind" : "ListValueType",
"elementType" : {
"kind" : "ClassValueType",
"className" : "int"
}
},
"name" : "xx"
},
"body" : [ {
"kind" : "AssignStmt",
"location" : [ 20, 13, 20, 27 ],
"targets" : [ {
"kind" : "MemberExpr",
"location" : [ 20, 13, 20, 18 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "bool"
},
"object" : {
"kind" : "Identifier",
"location" : [ 20, 13, 20, 16 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "bar"
},
"name" : "self"
},
"member" : {
"kind" : "Identifier",
"location" : [ 20, 18, 20, 18 ],
"name" : "p"
}
} ],
"value" : {
"kind" : "BinaryExpr",
"location" : [ 20, 22, 20, 27 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "bool"
},
"left" : {
"kind" : "Identifier",
"location" : [ 20, 22, 20, 22 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"name" : "x"
},
"operator" : "==",
"right" : {
"kind" : "IntegerLiteral",
"location" : [ 20, 27, 20, 27 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"value" : 2
}
}
} ]
}, {
"kind" : "ExprStmt",
"location" : [ 22, 9, 22, 14 ],
"expr" : {
"kind" : "CallExpr",
"location" : [ 22, 9, 22, 14 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "object"
},
"function" : {
"kind" : "Identifier",
"location" : [ 22, 9, 22, 11 ],
"inferredType" : {
"kind" : "FuncType",
"parameters" : [ {
"kind" : "ClassValueType",
"className" : "int"
} ],
"returnType" : {
"kind" : "ClassValueType",
"className" : "object"
}
},
"name" : "qux"
},
"args" : [ {
"kind" : "IntegerLiteral",
"location" : [ 22, 13, 22, 13 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"value" : 0
} ]
}
}, {
"kind" : "AssignStmt",
"location" : [ 24, 9, 24, 25 ],
"targets" : [ {
"kind" : "Identifier",
"location" : [ 24, 9, 24, 13 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"name" : "count"
} ],
"value" : {
"kind" : "BinaryExpr",
"location" : [ 24, 17, 24, 25 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"left" : {
"kind" : "Identifier",
"location" : [ 24, 17, 24, 21 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"name" : "count"
},
"operator" : "+",
"right" : {
"kind" : "IntegerLiteral",
"location" : [ 24, 25, 24, 25 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"value" : 1
}
}
}, {
"kind" : "WhileStmt",
"location" : [ 26, 9, 34, 8 ],
"condition" : {
"kind" : "BinaryExpr",
"location" : [ 26, 15, 26, 20 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "bool"
},
"left" : {
"kind" : "Identifier",
"location" : [ 26, 15, 26, 15 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"name" : "x"
},
"operator" : "<=",
"right" : {
"kind" : "IntegerLiteral",
"location" : [ 26, 20, 26, 20 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"value" : 0
}
},
"body" : [ {
"kind" : "IfStmt",
"location" : [ 27, 13, 34, 8 ],
"condition" : {
"kind" : "MemberExpr",
"location" : [ 27, 16, 27, 21 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "bool"
},
"object" : {
"kind" : "Identifier",
"location" : [ 27, 16, 27, 19 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "bar"
},
"name" : "self"
},
"member" : {
"kind" : "Identifier",
"location" : [ 27, 21, 27, 21 ],
"name" : "p"
}
},
"thenBody" : [ {
"kind" : "AssignStmt",
"location" : [ 28, 17, 28, 29 ],
"targets" : [ {
"kind" : "IndexExpr",
"location" : [ 28, 17, 28, 21 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"list" : {
"kind" : "Identifier",
"location" : [ 28, 17, 28, 18 ],
"inferredType" : {
"kind" : "ListValueType",
"elementType" : {
"kind" : "ClassValueType",
"className" : "int"
}
},
"name" : "xx"
},
"index" : {
"kind" : "IntegerLiteral",
"location" : [ 28, 20, 28, 20 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"value" : 0
}
} ],
"value" : {
"kind" : "IndexExpr",
"location" : [ 28, 25, 28, 29 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"list" : {
"kind" : "Identifier",
"location" : [ 28, 25, 28, 26 ],
"inferredType" : {
"kind" : "ListValueType",
"elementType" : {
"kind" : "ClassValueType",
"className" : "int"
}
},
"name" : "xx"
},
"index" : {
"kind" : "IntegerLiteral",
"location" : [ 28, 28, 28, 28 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"value" : 1
}
}
}, {
"kind" : "AssignStmt",
"location" : [ 29, 17, 29, 35 ],
"targets" : [ {
"kind" : "MemberExpr",
"location" : [ 29, 17, 29, 22 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "bool"
},
"object" : {
"kind" : "Identifier",
"location" : [ 29, 17, 29, 20 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "bar"
},
"name" : "self"
},
"member" : {
"kind" : "Identifier",
"location" : [ 29, 22, 29, 22 ],
"name" : "p"
}
} ],
"value" : {
"kind" : "UnaryExpr",
"location" : [ 29, 26, 29, 35 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "bool"
},
"operator" : "not",
"operand" : {
"kind" : "MemberExpr",
"location" : [ 29, 30, 29, 35 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "bool"
},
"object" : {
"kind" : "Identifier",
"location" : [ 29, 30, 29, 33 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "bar"
},
"name" : "self"
},
"member" : {
"kind" : "Identifier",
"location" : [ 29, 35, 29, 35 ],
"name" : "p"
}
}
}
}, {
"kind" : "AssignStmt",
"location" : [ 30, 17, 30, 25 ],
"targets" : [ {
"kind" : "Identifier",
"location" : [ 30, 17, 30, 17 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"name" : "x"
} ],
"value" : {
"kind" : "BinaryExpr",
"location" : [ 30, 21, 30, 25 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"left" : {
"kind" : "Identifier",
"location" : [ 30, 21, 30, 21 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"name" : "x"
},
"operator" : "+",
"right" : {
"kind" : "IntegerLiteral",
"location" : [ 30, 25, 30, 25 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"value" : 1
}
}
} ],
"elseBody" : [ {
"kind" : "IfStmt",
"location" : [ 31, 13, 34, 8 ],
"condition" : {
"kind" : "BinaryExpr",
"location" : [ 31, 18, 31, 36 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "bool"
},
"left" : {
"kind" : "CallExpr",
"location" : [ 31, 18, 31, 31 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"function" : {
"kind" : "Identifier",
"location" : [ 31, 18, 31, 20 ],
"inferredType" : {
"kind" : "FuncType",
"parameters" : [ {
"kind" : "ClassValueType",
"className" : "str"
} ],
"returnType" : {
"kind" : "ClassValueType",
"className" : "int"
}
},
"name" : "foo"
},
"args" : [ {
"kind" : "IndexExpr",
"location" : [ 31, 22, 31, 30 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "str"
},
"list" : {
"kind" : "StringLiteral",
"location" : [ 31, 22, 31, 27 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "str"
},
"value" : "Long"
},
"index" : {
"kind" : "IntegerLiteral",
"location" : [ 31, 29, 31, 29 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"value" : 0
}
} ]
},
"operator" : "==",
"right" : {
"kind" : "IntegerLiteral",
"location" : [ 31, 36, 31, 36 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"value" : 1
}
},
"thenBody" : [ {
"kind" : "AssignStmt",
"location" : [ 32, 17, 32, 37 ],
"targets" : [ {
"kind" : "MemberExpr",
"location" : [ 32, 17, 32, 22 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "bool"
},
"object" : {
"kind" : "Identifier",
"location" : [ 32, 17, 32, 20 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "bar"
},
"name" : "self"
},
"member" : {
"kind" : "Identifier",
"location" : [ 32, 22, 32, 22 ],
"name" : "p"
}
} ],
"value" : {
"kind" : "BinaryExpr",
"location" : [ 32, 26, 32, 37 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "bool"
},
"left" : {
"kind" : "Identifier",
"location" : [ 32, 26, 32, 29 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "bar"
},
"name" : "self"
},
"operator" : "is",
"right" : {
"kind" : "NoneLiteral",
"location" : [ 32, 34, 32, 37 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "<None>"
}
}
}
} ],
"elseBody" : [ ]
} ]
} ]
}, {
"kind" : "ReturnStmt",
"location" : [ 34, 9, 34, 21 ],
"value" : {
"kind" : "StringLiteral",
"location" : [ 34, 16, 34, 21 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "str"
},
"value" : "Nope"
}
} ]
} ]
} ],
"statements" : [ {
"kind" : "ExprStmt",
"location" : [ 36, 1, 36, 23 ],
"expr" : {
"kind" : "CallExpr",
"location" : [ 36, 1, 36, 23 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "<None>"
},
"function" : {
"kind" : "Identifier",
"location" : [ 36, 1, 36, 5 ],
"inferredType" : {
"kind" : "FuncType",
"parameters" : [ {
"kind" : "ClassValueType",
"className" : "object"
} ],
"returnType" : {
"kind" : "ClassValueType",
"className" : "<None>"
}
},
"name" : "print"
},
"args" : [ {
"kind" : "MethodCallExpr",
"location" : [ 36, 7, 36, 22 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "str"
},
"method" : {
"kind" : "MemberExpr",
"location" : [ 36, 7, 36, 15 ],
"inferredType" : {
"kind" : "FuncType",
"parameters" : [ {
"kind" : "ClassValueType",
"className" : "bar"
}, {
"kind" : "ListValueType",
"elementType" : {
"kind" : "ClassValueType",
"className" : "int"
}
} ],
"returnType" : {
"kind" : "ClassValueType",
"className" : "str"
}
},
"object" : {
"kind" : "CallExpr",
"location" : [ 36, 7, 36, 11 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "bar"
},
"function" : {
"kind" : "Identifier",
"location" : [ 36, 7, 36, 9 ],
"name" : "bar"
},
"args" : [ ]
},
"member" : {
"kind" : "Identifier",
"location" : [ 36, 13, 36, 15 ],
"name" : "baz"
}
},
"args" : [ {
"kind" : "ListExpr",
"location" : [ 36, 17, 36, 21 ],
"inferredType" : {
"kind" : "ListValueType",
"elementType" : {
"kind" : "ClassValueType",
"className" : "int"
}
},
"elements" : [ {
"kind" : "IntegerLiteral",
"location" : [ 36, 18, 36, 18 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"value" : 1
}, {
"kind" : "IntegerLiteral",
"location" : [ 36, 20, 36, 20 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"value" : 2
} ]
} ]
} ]
}
} ],
"errors" : {
"errors" : [ ],
"kind" : "Errors",
"location" : [ 0, 0, 0, 0 ]
}
}

@ -0,0 +1,11 @@
x:int = 0
y:int = 0
z:bool = False
x = z = 1 # Only one error here (assignment to `x = 1` should succeed)
x = y = None
x = y = []
x = a = None
x = a = []
x = y = True

@ -0,0 +1,177 @@
{
"kind" : "Program",
"location" : [ 1, 1, 10, 13 ],
"declarations" : [ {
"kind" : "VarDef",
"location" : [ 1, 1, 1, 9 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 1, 1, 1, 5 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 1, 1, 1, 1 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 1, 3, 1, 5 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 1, 9, 1, 9 ],
"value" : 0
}
}, {
"kind" : "VarDef",
"location" : [ 2, 1, 2, 9 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 2, 1, 2, 5 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 2, 1, 2, 1 ],
"name" : "y"
},
"type" : {
"kind" : "ClassType",
"location" : [ 2, 3, 2, 5 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 2, 9, 2, 9 ],
"value" : 0
}
}, {
"kind" : "VarDef",
"location" : [ 3, 1, 3, 14 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 3, 1, 3, 6 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 3, 1, 3, 1 ],
"name" : "z"
},
"type" : {
"kind" : "ClassType",
"location" : [ 3, 3, 3, 6 ],
"className" : "bool"
}
},
"value" : {
"kind" : "BooleanLiteral",
"location" : [ 3, 10, 3, 14 ],
"value" : false
}
} ],
"statements" : [ {
"kind" : "AssignStmt",
"location" : [ 5, 1, 5, 9 ],
"targets" : [ {
"kind" : "Identifier",
"location" : [ 5, 1, 5, 1 ],
"name" : "x"
}, {
"kind" : "Identifier",
"location" : [ 5, 5, 5, 5 ],
"name" : "z"
} ],
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 5, 9, 5, 9 ],
"value" : 1
}
}, {
"kind" : "AssignStmt",
"location" : [ 6, 1, 6, 12 ],
"targets" : [ {
"kind" : "Identifier",
"location" : [ 6, 1, 6, 1 ],
"name" : "x"
}, {
"kind" : "Identifier",
"location" : [ 6, 5, 6, 5 ],
"name" : "y"
} ],
"value" : {
"kind" : "NoneLiteral",
"location" : [ 6, 9, 6, 12 ]
}
}, {
"kind" : "AssignStmt",
"location" : [ 7, 1, 7, 10 ],
"targets" : [ {
"kind" : "Identifier",
"location" : [ 7, 1, 7, 1 ],
"name" : "x"
}, {
"kind" : "Identifier",
"location" : [ 7, 5, 7, 5 ],
"name" : "y"
} ],
"value" : {
"kind" : "ListExpr",
"location" : [ 7, 9, 7, 10 ],
"elements" : [ ]
}
}, {
"kind" : "AssignStmt",
"location" : [ 8, 1, 8, 12 ],
"targets" : [ {
"kind" : "Identifier",
"location" : [ 8, 1, 8, 1 ],
"name" : "x"
}, {
"kind" : "Identifier",
"location" : [ 8, 5, 8, 5 ],
"name" : "a"
} ],
"value" : {
"kind" : "NoneLiteral",
"location" : [ 8, 9, 8, 12 ]
}
}, {
"kind" : "AssignStmt",
"location" : [ 9, 1, 9, 10 ],
"targets" : [ {
"kind" : "Identifier",
"location" : [ 9, 1, 9, 1 ],
"name" : "x"
}, {
"kind" : "Identifier",
"location" : [ 9, 5, 9, 5 ],
"name" : "a"
} ],
"value" : {
"kind" : "ListExpr",
"location" : [ 9, 9, 9, 10 ],
"elements" : [ ]
}
}, {
"kind" : "AssignStmt",
"location" : [ 10, 1, 10, 12 ],
"targets" : [ {
"kind" : "Identifier",
"location" : [ 10, 1, 10, 1 ],
"name" : "x"
}, {
"kind" : "Identifier",
"location" : [ 10, 5, 10, 5 ],
"name" : "y"
} ],
"value" : {
"kind" : "BooleanLiteral",
"location" : [ 10, 9, 10, 12 ],
"value" : true
}
} ],
"errors" : {
"errors" : [ ],
"kind" : "Errors",
"location" : [ 0, 0, 0, 0 ]
}
}

@ -0,0 +1,301 @@
{
"kind" : "Program",
"location" : [ 1, 1, 10, 13 ],
"declarations" : [ {
"kind" : "VarDef",
"location" : [ 1, 1, 1, 9 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 1, 1, 1, 5 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 1, 1, 1, 1 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 1, 3, 1, 5 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 1, 9, 1, 9 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"value" : 0
}
}, {
"kind" : "VarDef",
"location" : [ 2, 1, 2, 9 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 2, 1, 2, 5 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 2, 1, 2, 1 ],
"name" : "y"
},
"type" : {
"kind" : "ClassType",
"location" : [ 2, 3, 2, 5 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 2, 9, 2, 9 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"value" : 0
}
}, {
"kind" : "VarDef",
"location" : [ 3, 1, 3, 14 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 3, 1, 3, 6 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 3, 1, 3, 1 ],
"name" : "z"
},
"type" : {
"kind" : "ClassType",
"location" : [ 3, 3, 3, 6 ],
"className" : "bool"
}
},
"value" : {
"kind" : "BooleanLiteral",
"location" : [ 3, 10, 3, 14 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "bool"
},
"value" : false
}
} ],
"statements" : [ {
"kind" : "AssignStmt",
"location" : [ 5, 1, 5, 9 ],
"errorMsg" : "Expected type `bool`; got type `int`",
"targets" : [ {
"kind" : "Identifier",
"location" : [ 5, 1, 5, 1 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"name" : "x"
}, {
"kind" : "Identifier",
"location" : [ 5, 5, 5, 5 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "bool"
},
"name" : "z"
} ],
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 5, 9, 5, 9 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"value" : 1
}
}, {
"kind" : "AssignStmt",
"location" : [ 6, 1, 6, 12 ],
"errorMsg" : "Expected type `int`; got type `<None>`",
"targets" : [ {
"kind" : "Identifier",
"location" : [ 6, 1, 6, 1 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"name" : "x"
}, {
"kind" : "Identifier",
"location" : [ 6, 5, 6, 5 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"name" : "y"
} ],
"value" : {
"kind" : "NoneLiteral",
"location" : [ 6, 9, 6, 12 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "<None>"
}
}
}, {
"kind" : "AssignStmt",
"location" : [ 7, 1, 7, 10 ],
"errorMsg" : "Expected type `int`; got type `<Empty>`",
"targets" : [ {
"kind" : "Identifier",
"location" : [ 7, 1, 7, 1 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"name" : "x"
}, {
"kind" : "Identifier",
"location" : [ 7, 5, 7, 5 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"name" : "y"
} ],
"value" : {
"kind" : "ListExpr",
"location" : [ 7, 9, 7, 10 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "<Empty>"
},
"elements" : [ ]
}
}, {
"kind" : "AssignStmt",
"location" : [ 8, 1, 8, 12 ],
"errorMsg" : "Expected type `int`; got type `<None>`",
"targets" : [ {
"kind" : "Identifier",
"location" : [ 8, 1, 8, 1 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"name" : "x"
}, {
"kind" : "Identifier",
"location" : [ 8, 5, 8, 5 ],
"errorMsg" : "Not a variable: a",
"inferredType" : {
"kind" : "ClassValueType",
"className" : "object"
},
"name" : "a"
} ],
"value" : {
"kind" : "NoneLiteral",
"location" : [ 8, 9, 8, 12 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "<None>"
}
}
}, {
"kind" : "AssignStmt",
"location" : [ 9, 1, 9, 10 ],
"errorMsg" : "Expected type `int`; got type `<Empty>`",
"targets" : [ {
"kind" : "Identifier",
"location" : [ 9, 1, 9, 1 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"name" : "x"
}, {
"kind" : "Identifier",
"location" : [ 9, 5, 9, 5 ],
"errorMsg" : "Not a variable: a",
"inferredType" : {
"kind" : "ClassValueType",
"className" : "object"
},
"name" : "a"
} ],
"value" : {
"kind" : "ListExpr",
"location" : [ 9, 9, 9, 10 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "<Empty>"
},
"elements" : [ ]
}
}, {
"kind" : "AssignStmt",
"location" : [ 10, 1, 10, 12 ],
"errorMsg" : "Expected type `int`; got type `bool`",
"targets" : [ {
"kind" : "Identifier",
"location" : [ 10, 1, 10, 1 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"name" : "x"
}, {
"kind" : "Identifier",
"location" : [ 10, 5, 10, 5 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"name" : "y"
} ],
"value" : {
"kind" : "BooleanLiteral",
"location" : [ 10, 9, 10, 12 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "bool"
},
"value" : true
}
} ],
"errors" : {
"errors" : [ {
"kind" : "CompilerError",
"location" : [ 5, 1, 5, 9 ],
"message" : "Expected type `bool`; got type `int`"
}, {
"kind" : "CompilerError",
"location" : [ 6, 1, 6, 12 ],
"message" : "Expected type `int`; got type `<None>`"
}, {
"kind" : "CompilerError",
"location" : [ 7, 1, 7, 10 ],
"message" : "Expected type `int`; got type `<Empty>`"
}, {
"kind" : "CompilerError",
"location" : [ 8, 1, 8, 12 ],
"message" : "Expected type `int`; got type `<None>`"
}, {
"kind" : "CompilerError",
"location" : [ 8, 5, 8, 5 ],
"message" : "Not a variable: a"
}, {
"kind" : "CompilerError",
"location" : [ 9, 1, 9, 10 ],
"message" : "Expected type `int`; got type `<Empty>`"
}, {
"kind" : "CompilerError",
"location" : [ 9, 5, 9, 5 ],
"message" : "Not a variable: a"
}, {
"kind" : "CompilerError",
"location" : [ 10, 1, 10, 12 ],
"message" : "Expected type `int`; got type `bool`"
} ],
"kind" : "Errors",
"location" : [ 0, 0, 0, 0 ]
}
}

@ -0,0 +1,13 @@
class A(object):
x:int = 1
def foo(self:"A") -> int:
return 0
class B(A):
x:int = 2 # Bad
foo:str = "" # Bad
A()

@ -0,0 +1,155 @@
{
"kind" : "Program",
"location" : [ 1, 1, 11, 4 ],
"declarations" : [ {
"kind" : "ClassDef",
"location" : [ 1, 1, 7, 0 ],
"name" : {
"kind" : "Identifier",
"location" : [ 1, 7, 1, 7 ],
"name" : "A"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 1, 9, 1, 14 ],
"name" : "object"
},
"declarations" : [ {
"kind" : "VarDef",
"location" : [ 2, 5, 2, 13 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 2, 5, 2, 9 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 2, 5, 2, 5 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 2, 7, 2, 9 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 2, 13, 2, 13 ],
"value" : 1
}
}, {
"kind" : "FuncDef",
"location" : [ 4, 5, 5, 17 ],
"name" : {
"kind" : "Identifier",
"location" : [ 4, 9, 4, 11 ],
"name" : "foo"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 4, 13, 4, 20 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 4, 13, 4, 16 ],
"name" : "self"
},
"type" : {
"kind" : "ClassType",
"location" : [ 4, 18, 4, 20 ],
"className" : "A"
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 4, 26, 4, 28 ],
"className" : "int"
},
"declarations" : [ ],
"statements" : [ {
"kind" : "ReturnStmt",
"location" : [ 5, 9, 5, 16 ],
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 5, 16, 5, 16 ],
"value" : 0
}
} ]
} ]
}, {
"kind" : "ClassDef",
"location" : [ 7, 1, 9, 23 ],
"name" : {
"kind" : "Identifier",
"location" : [ 7, 7, 7, 7 ],
"name" : "B"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 7, 9, 7, 9 ],
"name" : "A"
},
"declarations" : [ {
"kind" : "VarDef",
"location" : [ 8, 5, 8, 13 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 8, 5, 8, 9 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 8, 5, 8, 5 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 8, 7, 8, 9 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 8, 13, 8, 13 ],
"value" : 2
}
}, {
"kind" : "VarDef",
"location" : [ 9, 5, 9, 16 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 9, 5, 9, 11 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 9, 5, 9, 7 ],
"name" : "foo"
},
"type" : {
"kind" : "ClassType",
"location" : [ 9, 9, 9, 11 ],
"className" : "str"
}
},
"value" : {
"kind" : "StringLiteral",
"location" : [ 9, 15, 9, 16 ],
"value" : ""
}
} ]
} ],
"statements" : [ {
"kind" : "ExprStmt",
"location" : [ 11, 1, 11, 3 ],
"expr" : {
"kind" : "CallExpr",
"location" : [ 11, 1, 11, 3 ],
"function" : {
"kind" : "Identifier",
"location" : [ 11, 1, 11, 1 ],
"name" : "A"
},
"args" : [ ]
}
} ],
"errors" : {
"errors" : [ ],
"kind" : "Errors",
"location" : [ 0, 0, 0, 0 ]
}
}

@ -0,0 +1,165 @@
{
"kind" : "Program",
"location" : [ 1, 1, 11, 4 ],
"declarations" : [ {
"kind" : "ClassDef",
"location" : [ 1, 1, 7, 0 ],
"name" : {
"kind" : "Identifier",
"location" : [ 1, 7, 1, 7 ],
"name" : "A"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 1, 9, 1, 14 ],
"name" : "object"
},
"declarations" : [ {
"kind" : "VarDef",
"location" : [ 2, 5, 2, 13 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 2, 5, 2, 9 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 2, 5, 2, 5 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 2, 7, 2, 9 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 2, 13, 2, 13 ],
"value" : 1
}
}, {
"kind" : "FuncDef",
"location" : [ 4, 5, 5, 17 ],
"name" : {
"kind" : "Identifier",
"location" : [ 4, 9, 4, 11 ],
"name" : "foo"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 4, 13, 4, 20 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 4, 13, 4, 16 ],
"name" : "self"
},
"type" : {
"kind" : "ClassType",
"location" : [ 4, 18, 4, 20 ],
"className" : "A"
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 4, 26, 4, 28 ],
"className" : "int"
},
"declarations" : [ ],
"statements" : [ {
"kind" : "ReturnStmt",
"location" : [ 5, 9, 5, 16 ],
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 5, 16, 5, 16 ],
"value" : 0
}
} ]
} ]
}, {
"kind" : "ClassDef",
"location" : [ 7, 1, 9, 23 ],
"name" : {
"kind" : "Identifier",
"location" : [ 7, 7, 7, 7 ],
"name" : "B"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 7, 9, 7, 9 ],
"name" : "A"
},
"declarations" : [ {
"kind" : "VarDef",
"location" : [ 8, 5, 8, 13 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 8, 5, 8, 9 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 8, 5, 8, 5 ],
"errorMsg" : "Cannot re-define attribute: x",
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 8, 7, 8, 9 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 8, 13, 8, 13 ],
"value" : 2
}
}, {
"kind" : "VarDef",
"location" : [ 9, 5, 9, 16 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 9, 5, 9, 11 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 9, 5, 9, 7 ],
"errorMsg" : "Cannot re-define attribute: foo",
"name" : "foo"
},
"type" : {
"kind" : "ClassType",
"location" : [ 9, 9, 9, 11 ],
"className" : "str"
}
},
"value" : {
"kind" : "StringLiteral",
"location" : [ 9, 15, 9, 16 ],
"value" : ""
}
} ]
} ],
"statements" : [ {
"kind" : "ExprStmt",
"location" : [ 11, 1, 11, 3 ],
"expr" : {
"kind" : "CallExpr",
"location" : [ 11, 1, 11, 3 ],
"function" : {
"kind" : "Identifier",
"location" : [ 11, 1, 11, 1 ],
"name" : "A"
},
"args" : [ ]
}
} ],
"errors" : {
"errors" : [ {
"kind" : "CompilerError",
"location" : [ 8, 5, 8, 5 ],
"message" : "Cannot re-define attribute: x"
}, {
"kind" : "CompilerError",
"location" : [ 9, 5, 9, 7 ],
"message" : "Cannot re-define attribute: foo"
} ],
"kind" : "Errors",
"location" : [ 0, 0, 0, 0 ]
}
}

@ -0,0 +1,4 @@
class A(object):
x:int = True
A()

@ -0,0 +1,60 @@
{
"kind" : "Program",
"location" : [ 1, 1, 4, 4 ],
"declarations" : [ {
"kind" : "ClassDef",
"location" : [ 1, 1, 2, 17 ],
"name" : {
"kind" : "Identifier",
"location" : [ 1, 7, 1, 7 ],
"name" : "A"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 1, 9, 1, 14 ],
"name" : "object"
},
"declarations" : [ {
"kind" : "VarDef",
"location" : [ 2, 5, 2, 16 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 2, 5, 2, 9 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 2, 5, 2, 5 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 2, 7, 2, 9 ],
"className" : "int"
}
},
"value" : {
"kind" : "BooleanLiteral",
"location" : [ 2, 13, 2, 16 ],
"value" : true
}
} ]
} ],
"statements" : [ {
"kind" : "ExprStmt",
"location" : [ 4, 1, 4, 3 ],
"expr" : {
"kind" : "CallExpr",
"location" : [ 4, 1, 4, 3 ],
"function" : {
"kind" : "Identifier",
"location" : [ 4, 1, 4, 1 ],
"name" : "A"
},
"args" : [ ]
}
} ],
"errors" : {
"errors" : [ ],
"kind" : "Errors",
"location" : [ 0, 0, 0, 0 ]
}
}

@ -0,0 +1,73 @@
{
"kind" : "Program",
"location" : [ 1, 1, 4, 4 ],
"declarations" : [ {
"kind" : "ClassDef",
"location" : [ 1, 1, 2, 17 ],
"name" : {
"kind" : "Identifier",
"location" : [ 1, 7, 1, 7 ],
"name" : "A"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 1, 9, 1, 14 ],
"name" : "object"
},
"declarations" : [ {
"kind" : "VarDef",
"location" : [ 2, 5, 2, 16 ],
"errorMsg" : "Expected type `int`; got type `bool`",
"var" : {
"kind" : "TypedVar",
"location" : [ 2, 5, 2, 9 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 2, 5, 2, 5 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 2, 7, 2, 9 ],
"className" : "int"
}
},
"value" : {
"kind" : "BooleanLiteral",
"location" : [ 2, 13, 2, 16 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "bool"
},
"value" : true
}
} ]
} ],
"statements" : [ {
"kind" : "ExprStmt",
"location" : [ 4, 1, 4, 3 ],
"expr" : {
"kind" : "CallExpr",
"location" : [ 4, 1, 4, 3 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "A"
},
"function" : {
"kind" : "Identifier",
"location" : [ 4, 1, 4, 1 ],
"name" : "A"
},
"args" : [ ]
}
} ],
"errors" : {
"errors" : [ {
"kind" : "CompilerError",
"location" : [ 2, 5, 2, 16 ],
"message" : "Expected type `int`; got type `bool`"
} ],
"kind" : "Errors",
"location" : [ 0, 0, 0, 0 ]
}
}

@ -0,0 +1,8 @@
class A(object):
x:int = 1
def __init__(self:"A", x:int): # Bad override
pass
A(1)

@ -0,0 +1,106 @@
{
"kind" : "Program",
"location" : [ 1, 1, 7, 5 ],
"declarations" : [ {
"kind" : "ClassDef",
"location" : [ 1, 1, 7, 0 ],
"name" : {
"kind" : "Identifier",
"location" : [ 1, 7, 1, 7 ],
"name" : "A"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 1, 9, 1, 14 ],
"name" : "object"
},
"declarations" : [ {
"kind" : "VarDef",
"location" : [ 2, 5, 2, 13 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 2, 5, 2, 9 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 2, 5, 2, 5 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 2, 7, 2, 9 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 2, 13, 2, 13 ],
"value" : 1
}
}, {
"kind" : "FuncDef",
"location" : [ 4, 5, 5, 13 ],
"name" : {
"kind" : "Identifier",
"location" : [ 4, 9, 4, 16 ],
"name" : "__init__"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 4, 18, 4, 25 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 4, 18, 4, 21 ],
"name" : "self"
},
"type" : {
"kind" : "ClassType",
"location" : [ 4, 23, 4, 25 ],
"className" : "A"
}
}, {
"kind" : "TypedVar",
"location" : [ 4, 28, 4, 32 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 4, 28, 4, 28 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 4, 30, 4, 32 ],
"className" : "int"
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 4, 34, 4, 34 ],
"className" : "<None>"
},
"declarations" : [ ],
"statements" : [ ]
} ]
} ],
"statements" : [ {
"kind" : "ExprStmt",
"location" : [ 7, 1, 7, 4 ],
"expr" : {
"kind" : "CallExpr",
"location" : [ 7, 1, 7, 4 ],
"function" : {
"kind" : "Identifier",
"location" : [ 7, 1, 7, 1 ],
"name" : "A"
},
"args" : [ {
"kind" : "IntegerLiteral",
"location" : [ 7, 3, 7, 3 ],
"value" : 1
} ]
}
} ],
"errors" : {
"errors" : [ ],
"kind" : "Errors",
"location" : [ 0, 0, 0, 0 ]
}
}

@ -0,0 +1,111 @@
{
"kind" : "Program",
"location" : [ 1, 1, 7, 5 ],
"declarations" : [ {
"kind" : "ClassDef",
"location" : [ 1, 1, 7, 0 ],
"name" : {
"kind" : "Identifier",
"location" : [ 1, 7, 1, 7 ],
"name" : "A"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 1, 9, 1, 14 ],
"name" : "object"
},
"declarations" : [ {
"kind" : "VarDef",
"location" : [ 2, 5, 2, 13 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 2, 5, 2, 9 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 2, 5, 2, 5 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 2, 7, 2, 9 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 2, 13, 2, 13 ],
"value" : 1
}
}, {
"kind" : "FuncDef",
"location" : [ 4, 5, 5, 13 ],
"name" : {
"kind" : "Identifier",
"location" : [ 4, 9, 4, 16 ],
"errorMsg" : "Method overridden with different type signature: __init__",
"name" : "__init__"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 4, 18, 4, 25 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 4, 18, 4, 21 ],
"name" : "self"
},
"type" : {
"kind" : "ClassType",
"location" : [ 4, 23, 4, 25 ],
"className" : "A"
}
}, {
"kind" : "TypedVar",
"location" : [ 4, 28, 4, 32 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 4, 28, 4, 28 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 4, 30, 4, 32 ],
"className" : "int"
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 4, 34, 4, 34 ],
"className" : "<None>"
},
"declarations" : [ ],
"statements" : [ ]
} ]
} ],
"statements" : [ {
"kind" : "ExprStmt",
"location" : [ 7, 1, 7, 4 ],
"expr" : {
"kind" : "CallExpr",
"location" : [ 7, 1, 7, 4 ],
"function" : {
"kind" : "Identifier",
"location" : [ 7, 1, 7, 1 ],
"name" : "A"
},
"args" : [ {
"kind" : "IntegerLiteral",
"location" : [ 7, 3, 7, 3 ],
"value" : 1
} ]
}
} ],
"errors" : {
"errors" : [ {
"kind" : "CompilerError",
"location" : [ 4, 9, 4, 16 ],
"message" : "Method overridden with different type signature: __init__"
} ],
"kind" : "Errors",
"location" : [ 0, 0, 0, 0 ]
}
}

@ -0,0 +1,5 @@
class A(object):
def __init__(self:"A"):
return 1 # Bad
A()

@ -0,0 +1,75 @@
{
"kind" : "Program",
"location" : [ 1, 1, 5, 4 ],
"declarations" : [ {
"kind" : "ClassDef",
"location" : [ 1, 1, 5, 0 ],
"name" : {
"kind" : "Identifier",
"location" : [ 1, 7, 1, 7 ],
"name" : "A"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 1, 9, 1, 14 ],
"name" : "object"
},
"declarations" : [ {
"kind" : "FuncDef",
"location" : [ 2, 5, 3, 23 ],
"name" : {
"kind" : "Identifier",
"location" : [ 2, 9, 2, 16 ],
"name" : "__init__"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 2, 18, 2, 25 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 2, 18, 2, 21 ],
"name" : "self"
},
"type" : {
"kind" : "ClassType",
"location" : [ 2, 23, 2, 25 ],
"className" : "A"
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 2, 27, 2, 27 ],
"className" : "<None>"
},
"declarations" : [ ],
"statements" : [ {
"kind" : "ReturnStmt",
"location" : [ 3, 9, 3, 16 ],
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 3, 16, 3, 16 ],
"value" : 1
}
} ]
} ]
} ],
"statements" : [ {
"kind" : "ExprStmt",
"location" : [ 5, 1, 5, 3 ],
"expr" : {
"kind" : "CallExpr",
"location" : [ 5, 1, 5, 3 ],
"function" : {
"kind" : "Identifier",
"location" : [ 5, 1, 5, 1 ],
"name" : "A"
},
"args" : [ ]
}
} ],
"errors" : {
"errors" : [ ],
"kind" : "Errors",
"location" : [ 0, 0, 0, 0 ]
}
}

@ -0,0 +1,88 @@
{
"kind" : "Program",
"location" : [ 1, 1, 5, 4 ],
"declarations" : [ {
"kind" : "ClassDef",
"location" : [ 1, 1, 5, 0 ],
"name" : {
"kind" : "Identifier",
"location" : [ 1, 7, 1, 7 ],
"name" : "A"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 1, 9, 1, 14 ],
"name" : "object"
},
"declarations" : [ {
"kind" : "FuncDef",
"location" : [ 2, 5, 3, 23 ],
"name" : {
"kind" : "Identifier",
"location" : [ 2, 9, 2, 16 ],
"name" : "__init__"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 2, 18, 2, 25 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 2, 18, 2, 21 ],
"name" : "self"
},
"type" : {
"kind" : "ClassType",
"location" : [ 2, 23, 2, 25 ],
"className" : "A"
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 2, 27, 2, 27 ],
"className" : "<None>"
},
"declarations" : [ ],
"statements" : [ {
"kind" : "ReturnStmt",
"location" : [ 3, 9, 3, 16 ],
"errorMsg" : "Expected type `<None>`; got type `int`",
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 3, 16, 3, 16 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"value" : 1
}
} ]
} ]
} ],
"statements" : [ {
"kind" : "ExprStmt",
"location" : [ 5, 1, 5, 3 ],
"expr" : {
"kind" : "CallExpr",
"location" : [ 5, 1, 5, 3 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "A"
},
"function" : {
"kind" : "Identifier",
"location" : [ 5, 1, 5, 1 ],
"name" : "A"
},
"args" : [ ]
}
} ],
"errors" : {
"errors" : [ {
"kind" : "CompilerError",
"location" : [ 3, 9, 3, 16 ],
"message" : "Expected type `<None>`; got type `int`"
} ],
"kind" : "Errors",
"location" : [ 0, 0, 0, 0 ]
}
}

@ -0,0 +1,6 @@
x:int = 0
o:object = None
x.foo
o.bar
o.baz = 1

@ -0,0 +1,110 @@
{
"kind" : "Program",
"location" : [ 1, 1, 6, 10 ],
"declarations" : [ {
"kind" : "VarDef",
"location" : [ 1, 1, 1, 9 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 1, 1, 1, 5 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 1, 1, 1, 1 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 1, 3, 1, 5 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 1, 9, 1, 9 ],
"value" : 0
}
}, {
"kind" : "VarDef",
"location" : [ 2, 1, 2, 15 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 2, 1, 2, 8 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 2, 1, 2, 1 ],
"name" : "o"
},
"type" : {
"kind" : "ClassType",
"location" : [ 2, 3, 2, 8 ],
"className" : "object"
}
},
"value" : {
"kind" : "NoneLiteral",
"location" : [ 2, 12, 2, 15 ]
}
} ],
"statements" : [ {
"kind" : "ExprStmt",
"location" : [ 4, 1, 4, 5 ],
"expr" : {
"kind" : "MemberExpr",
"location" : [ 4, 1, 4, 5 ],
"object" : {
"kind" : "Identifier",
"location" : [ 4, 1, 4, 1 ],
"name" : "x"
},
"member" : {
"kind" : "Identifier",
"location" : [ 4, 3, 4, 5 ],
"name" : "foo"
}
}
}, {
"kind" : "ExprStmt",
"location" : [ 5, 1, 5, 5 ],
"expr" : {
"kind" : "MemberExpr",
"location" : [ 5, 1, 5, 5 ],
"object" : {
"kind" : "Identifier",
"location" : [ 5, 1, 5, 1 ],
"name" : "o"
},
"member" : {
"kind" : "Identifier",
"location" : [ 5, 3, 5, 5 ],
"name" : "bar"
}
}
}, {
"kind" : "AssignStmt",
"location" : [ 6, 1, 6, 9 ],
"targets" : [ {
"kind" : "MemberExpr",
"location" : [ 6, 1, 6, 5 ],
"object" : {
"kind" : "Identifier",
"location" : [ 6, 1, 6, 1 ],
"name" : "o"
},
"member" : {
"kind" : "Identifier",
"location" : [ 6, 3, 6, 5 ],
"name" : "baz"
}
} ],
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 6, 9, 6, 9 ],
"value" : 1
}
} ],
"errors" : {
"errors" : [ ],
"kind" : "Errors",
"location" : [ 0, 0, 0, 0 ]
}
}

@ -0,0 +1,161 @@
{
"kind" : "Program",
"location" : [ 1, 1, 6, 10 ],
"declarations" : [ {
"kind" : "VarDef",
"location" : [ 1, 1, 1, 9 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 1, 1, 1, 5 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 1, 1, 1, 1 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 1, 3, 1, 5 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 1, 9, 1, 9 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"value" : 0
}
}, {
"kind" : "VarDef",
"location" : [ 2, 1, 2, 15 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 2, 1, 2, 8 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 2, 1, 2, 1 ],
"name" : "o"
},
"type" : {
"kind" : "ClassType",
"location" : [ 2, 3, 2, 8 ],
"className" : "object"
}
},
"value" : {
"kind" : "NoneLiteral",
"location" : [ 2, 12, 2, 15 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "<None>"
}
}
} ],
"statements" : [ {
"kind" : "ExprStmt",
"location" : [ 4, 1, 4, 5 ],
"expr" : {
"kind" : "MemberExpr",
"location" : [ 4, 1, 4, 5 ],
"errorMsg" : "There is no attribute named `foo` in class `int`",
"inferredType" : {
"kind" : "ClassValueType",
"className" : "object"
},
"object" : {
"kind" : "Identifier",
"location" : [ 4, 1, 4, 1 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"name" : "x"
},
"member" : {
"kind" : "Identifier",
"location" : [ 4, 3, 4, 5 ],
"name" : "foo"
}
}
}, {
"kind" : "ExprStmt",
"location" : [ 5, 1, 5, 5 ],
"expr" : {
"kind" : "MemberExpr",
"location" : [ 5, 1, 5, 5 ],
"errorMsg" : "There is no attribute named `bar` in class `object`",
"inferredType" : {
"kind" : "ClassValueType",
"className" : "object"
},
"object" : {
"kind" : "Identifier",
"location" : [ 5, 1, 5, 1 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "object"
},
"name" : "o"
},
"member" : {
"kind" : "Identifier",
"location" : [ 5, 3, 5, 5 ],
"name" : "bar"
}
}
}, {
"kind" : "AssignStmt",
"location" : [ 6, 1, 6, 9 ],
"targets" : [ {
"kind" : "MemberExpr",
"location" : [ 6, 1, 6, 5 ],
"errorMsg" : "There is no attribute named `baz` in class `object`",
"inferredType" : {
"kind" : "ClassValueType",
"className" : "object"
},
"object" : {
"kind" : "Identifier",
"location" : [ 6, 1, 6, 1 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "object"
},
"name" : "o"
},
"member" : {
"kind" : "Identifier",
"location" : [ 6, 3, 6, 5 ],
"name" : "baz"
}
} ],
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 6, 9, 6, 9 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"value" : 1
}
} ],
"errors" : {
"errors" : [ {
"kind" : "CompilerError",
"location" : [ 4, 1, 4, 5 ],
"message" : "There is no attribute named `foo` in class `int`"
}, {
"kind" : "CompilerError",
"location" : [ 5, 1, 5, 5 ],
"message" : "There is no attribute named `bar` in class `object`"
}, {
"kind" : "CompilerError",
"location" : [ 6, 1, 6, 5 ],
"message" : "There is no attribute named `baz` in class `object`"
} ],
"kind" : "Errors",
"location" : [ 0, 0, 0, 0 ]
}
}

@ -0,0 +1,14 @@
class A(object):
x:int = 1
def foo(self:"A") -> int: # OK
return 0
def bar() -> int: # Needs self param
return 0
def baz(self:int) -> int: # Incorrect self type
return 0
A()

@ -0,0 +1,158 @@
{
"kind" : "Program",
"location" : [ 1, 1, 13, 4 ],
"declarations" : [ {
"kind" : "ClassDef",
"location" : [ 1, 1, 13, 0 ],
"name" : {
"kind" : "Identifier",
"location" : [ 1, 7, 1, 7 ],
"name" : "A"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 1, 9, 1, 14 ],
"name" : "object"
},
"declarations" : [ {
"kind" : "VarDef",
"location" : [ 2, 5, 2, 13 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 2, 5, 2, 9 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 2, 5, 2, 5 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 2, 7, 2, 9 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 2, 13, 2, 13 ],
"value" : 1
}
}, {
"kind" : "FuncDef",
"location" : [ 4, 5, 5, 17 ],
"name" : {
"kind" : "Identifier",
"location" : [ 4, 9, 4, 11 ],
"name" : "foo"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 4, 13, 4, 20 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 4, 13, 4, 16 ],
"name" : "self"
},
"type" : {
"kind" : "ClassType",
"location" : [ 4, 18, 4, 20 ],
"className" : "A"
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 4, 26, 4, 28 ],
"className" : "int"
},
"declarations" : [ ],
"statements" : [ {
"kind" : "ReturnStmt",
"location" : [ 5, 9, 5, 16 ],
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 5, 16, 5, 16 ],
"value" : 0
}
} ]
}, {
"kind" : "FuncDef",
"location" : [ 7, 5, 8, 17 ],
"name" : {
"kind" : "Identifier",
"location" : [ 7, 9, 7, 11 ],
"name" : "bar"
},
"params" : [ ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 7, 18, 7, 20 ],
"className" : "int"
},
"declarations" : [ ],
"statements" : [ {
"kind" : "ReturnStmt",
"location" : [ 8, 9, 8, 16 ],
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 8, 16, 8, 16 ],
"value" : 0
}
} ]
}, {
"kind" : "FuncDef",
"location" : [ 10, 5, 11, 17 ],
"name" : {
"kind" : "Identifier",
"location" : [ 10, 9, 10, 11 ],
"name" : "baz"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 10, 13, 10, 20 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 10, 13, 10, 16 ],
"name" : "self"
},
"type" : {
"kind" : "ClassType",
"location" : [ 10, 18, 10, 20 ],
"className" : "int"
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 10, 26, 10, 28 ],
"className" : "int"
},
"declarations" : [ ],
"statements" : [ {
"kind" : "ReturnStmt",
"location" : [ 11, 9, 11, 16 ],
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 11, 16, 11, 16 ],
"value" : 0
}
} ]
} ]
} ],
"statements" : [ {
"kind" : "ExprStmt",
"location" : [ 13, 1, 13, 3 ],
"expr" : {
"kind" : "CallExpr",
"location" : [ 13, 1, 13, 3 ],
"function" : {
"kind" : "Identifier",
"location" : [ 13, 1, 13, 1 ],
"name" : "A"
},
"args" : [ ]
}
} ],
"errors" : {
"errors" : [ ],
"kind" : "Errors",
"location" : [ 0, 0, 0, 0 ]
}
}

@ -0,0 +1,168 @@
{
"kind" : "Program",
"location" : [ 1, 1, 13, 4 ],
"declarations" : [ {
"kind" : "ClassDef",
"location" : [ 1, 1, 13, 0 ],
"name" : {
"kind" : "Identifier",
"location" : [ 1, 7, 1, 7 ],
"name" : "A"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 1, 9, 1, 14 ],
"name" : "object"
},
"declarations" : [ {
"kind" : "VarDef",
"location" : [ 2, 5, 2, 13 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 2, 5, 2, 9 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 2, 5, 2, 5 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 2, 7, 2, 9 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 2, 13, 2, 13 ],
"value" : 1
}
}, {
"kind" : "FuncDef",
"location" : [ 4, 5, 5, 17 ],
"name" : {
"kind" : "Identifier",
"location" : [ 4, 9, 4, 11 ],
"name" : "foo"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 4, 13, 4, 20 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 4, 13, 4, 16 ],
"name" : "self"
},
"type" : {
"kind" : "ClassType",
"location" : [ 4, 18, 4, 20 ],
"className" : "A"
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 4, 26, 4, 28 ],
"className" : "int"
},
"declarations" : [ ],
"statements" : [ {
"kind" : "ReturnStmt",
"location" : [ 5, 9, 5, 16 ],
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 5, 16, 5, 16 ],
"value" : 0
}
} ]
}, {
"kind" : "FuncDef",
"location" : [ 7, 5, 8, 17 ],
"name" : {
"kind" : "Identifier",
"location" : [ 7, 9, 7, 11 ],
"errorMsg" : "First parameter of the following method must be of the enclosing class: bar",
"name" : "bar"
},
"params" : [ ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 7, 18, 7, 20 ],
"className" : "int"
},
"declarations" : [ ],
"statements" : [ {
"kind" : "ReturnStmt",
"location" : [ 8, 9, 8, 16 ],
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 8, 16, 8, 16 ],
"value" : 0
}
} ]
}, {
"kind" : "FuncDef",
"location" : [ 10, 5, 11, 17 ],
"name" : {
"kind" : "Identifier",
"location" : [ 10, 9, 10, 11 ],
"errorMsg" : "First parameter of the following method must be of the enclosing class: baz",
"name" : "baz"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 10, 13, 10, 20 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 10, 13, 10, 16 ],
"name" : "self"
},
"type" : {
"kind" : "ClassType",
"location" : [ 10, 18, 10, 20 ],
"className" : "int"
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 10, 26, 10, 28 ],
"className" : "int"
},
"declarations" : [ ],
"statements" : [ {
"kind" : "ReturnStmt",
"location" : [ 11, 9, 11, 16 ],
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 11, 16, 11, 16 ],
"value" : 0
}
} ]
} ]
} ],
"statements" : [ {
"kind" : "ExprStmt",
"location" : [ 13, 1, 13, 3 ],
"expr" : {
"kind" : "CallExpr",
"location" : [ 13, 1, 13, 3 ],
"function" : {
"kind" : "Identifier",
"location" : [ 13, 1, 13, 1 ],
"name" : "A"
},
"args" : [ ]
}
} ],
"errors" : {
"errors" : [ {
"kind" : "CompilerError",
"location" : [ 7, 9, 7, 11 ],
"message" : "First parameter of the following method must be of the enclosing class: bar"
}, {
"kind" : "CompilerError",
"location" : [ 10, 9, 10, 11 ],
"message" : "First parameter of the following method must be of the enclosing class: baz"
} ],
"kind" : "Errors",
"location" : [ 0, 0, 0, 0 ]
}
}

@ -0,0 +1,30 @@
class A(object):
x:int = 1
def get_A(self: "A") -> int:
return self.x
class B(A):
def __init__(self: "B"):
pass
class C(B):
z:bool = True
def set_A(self: "C", val: int) -> object:
self.x = val
a:A = None
b:B = None
c:C = None
a = A()
b = B()
c = C()
a.get_A(1)
b.get_Z()
c.set_A()
c.set_A(False)
c.set_A(None)

@ -0,0 +1,474 @@
{
"kind" : "Program",
"location" : [ 1, 1, 29, 14 ],
"declarations" : [ {
"kind" : "ClassDef",
"location" : [ 1, 1, 7, 0 ],
"name" : {
"kind" : "Identifier",
"location" : [ 1, 7, 1, 7 ],
"name" : "A"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 1, 9, 1, 14 ],
"name" : "object"
},
"declarations" : [ {
"kind" : "VarDef",
"location" : [ 2, 5, 2, 13 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 2, 5, 2, 9 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 2, 5, 2, 5 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 2, 7, 2, 9 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 2, 13, 2, 13 ],
"value" : 1
}
}, {
"kind" : "FuncDef",
"location" : [ 4, 5, 5, 22 ],
"name" : {
"kind" : "Identifier",
"location" : [ 4, 9, 4, 13 ],
"name" : "get_A"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 4, 15, 4, 23 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 4, 15, 4, 18 ],
"name" : "self"
},
"type" : {
"kind" : "ClassType",
"location" : [ 4, 21, 4, 23 ],
"className" : "A"
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 4, 29, 4, 31 ],
"className" : "int"
},
"declarations" : [ ],
"statements" : [ {
"kind" : "ReturnStmt",
"location" : [ 5, 9, 5, 21 ],
"value" : {
"kind" : "MemberExpr",
"location" : [ 5, 16, 5, 21 ],
"object" : {
"kind" : "Identifier",
"location" : [ 5, 16, 5, 19 ],
"name" : "self"
},
"member" : {
"kind" : "Identifier",
"location" : [ 5, 21, 5, 21 ],
"name" : "x"
}
}
} ]
} ]
}, {
"kind" : "ClassDef",
"location" : [ 7, 1, 11, 0 ],
"name" : {
"kind" : "Identifier",
"location" : [ 7, 7, 7, 7 ],
"name" : "B"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 7, 9, 7, 9 ],
"name" : "A"
},
"declarations" : [ {
"kind" : "FuncDef",
"location" : [ 8, 5, 9, 13 ],
"name" : {
"kind" : "Identifier",
"location" : [ 8, 9, 8, 16 ],
"name" : "__init__"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 8, 18, 8, 26 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 8, 18, 8, 21 ],
"name" : "self"
},
"type" : {
"kind" : "ClassType",
"location" : [ 8, 24, 8, 26 ],
"className" : "B"
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 8, 28, 8, 28 ],
"className" : "<None>"
},
"declarations" : [ ],
"statements" : [ ]
} ]
}, {
"kind" : "ClassDef",
"location" : [ 11, 1, 17, 0 ],
"name" : {
"kind" : "Identifier",
"location" : [ 11, 7, 11, 7 ],
"name" : "C"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 11, 9, 11, 9 ],
"name" : "B"
},
"declarations" : [ {
"kind" : "VarDef",
"location" : [ 12, 5, 12, 17 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 12, 5, 12, 10 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 12, 5, 12, 5 ],
"name" : "z"
},
"type" : {
"kind" : "ClassType",
"location" : [ 12, 7, 12, 10 ],
"className" : "bool"
}
},
"value" : {
"kind" : "BooleanLiteral",
"location" : [ 12, 14, 12, 17 ],
"value" : true
}
}, {
"kind" : "FuncDef",
"location" : [ 14, 5, 15, 21 ],
"name" : {
"kind" : "Identifier",
"location" : [ 14, 9, 14, 13 ],
"name" : "set_A"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 14, 15, 14, 23 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 14, 15, 14, 18 ],
"name" : "self"
},
"type" : {
"kind" : "ClassType",
"location" : [ 14, 21, 14, 23 ],
"className" : "C"
}
}, {
"kind" : "TypedVar",
"location" : [ 14, 26, 14, 33 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 14, 26, 14, 28 ],
"name" : "val"
},
"type" : {
"kind" : "ClassType",
"location" : [ 14, 31, 14, 33 ],
"className" : "int"
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 14, 39, 14, 44 ],
"className" : "object"
},
"declarations" : [ ],
"statements" : [ {
"kind" : "AssignStmt",
"location" : [ 15, 9, 15, 20 ],
"targets" : [ {
"kind" : "MemberExpr",
"location" : [ 15, 9, 15, 14 ],
"object" : {
"kind" : "Identifier",
"location" : [ 15, 9, 15, 12 ],
"name" : "self"
},
"member" : {
"kind" : "Identifier",
"location" : [ 15, 14, 15, 14 ],
"name" : "x"
}
} ],
"value" : {
"kind" : "Identifier",
"location" : [ 15, 18, 15, 20 ],
"name" : "val"
}
} ]
} ]
}, {
"kind" : "VarDef",
"location" : [ 17, 1, 17, 10 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 17, 1, 17, 3 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 17, 1, 17, 1 ],
"name" : "a"
},
"type" : {
"kind" : "ClassType",
"location" : [ 17, 3, 17, 3 ],
"className" : "A"
}
},
"value" : {
"kind" : "NoneLiteral",
"location" : [ 17, 7, 17, 10 ]
}
}, {
"kind" : "VarDef",
"location" : [ 18, 1, 18, 10 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 18, 1, 18, 3 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 18, 1, 18, 1 ],
"name" : "b"
},
"type" : {
"kind" : "ClassType",
"location" : [ 18, 3, 18, 3 ],
"className" : "B"
}
},
"value" : {
"kind" : "NoneLiteral",
"location" : [ 18, 7, 18, 10 ]
}
}, {
"kind" : "VarDef",
"location" : [ 19, 1, 19, 10 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 19, 1, 19, 3 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 19, 1, 19, 1 ],
"name" : "c"
},
"type" : {
"kind" : "ClassType",
"location" : [ 19, 3, 19, 3 ],
"className" : "C"
}
},
"value" : {
"kind" : "NoneLiteral",
"location" : [ 19, 7, 19, 10 ]
}
} ],
"statements" : [ {
"kind" : "AssignStmt",
"location" : [ 21, 1, 21, 7 ],
"targets" : [ {
"kind" : "Identifier",
"location" : [ 21, 1, 21, 1 ],
"name" : "a"
} ],
"value" : {
"kind" : "CallExpr",
"location" : [ 21, 5, 21, 7 ],
"function" : {
"kind" : "Identifier",
"location" : [ 21, 5, 21, 5 ],
"name" : "A"
},
"args" : [ ]
}
}, {
"kind" : "AssignStmt",
"location" : [ 22, 1, 22, 7 ],
"targets" : [ {
"kind" : "Identifier",
"location" : [ 22, 1, 22, 1 ],
"name" : "b"
} ],
"value" : {
"kind" : "CallExpr",
"location" : [ 22, 5, 22, 7 ],
"function" : {
"kind" : "Identifier",
"location" : [ 22, 5, 22, 5 ],
"name" : "B"
},
"args" : [ ]
}
}, {
"kind" : "AssignStmt",
"location" : [ 23, 1, 23, 7 ],
"targets" : [ {
"kind" : "Identifier",
"location" : [ 23, 1, 23, 1 ],
"name" : "c"
} ],
"value" : {
"kind" : "CallExpr",
"location" : [ 23, 5, 23, 7 ],
"function" : {
"kind" : "Identifier",
"location" : [ 23, 5, 23, 5 ],
"name" : "C"
},
"args" : [ ]
}
}, {
"kind" : "ExprStmt",
"location" : [ 25, 1, 25, 10 ],
"expr" : {
"kind" : "MethodCallExpr",
"location" : [ 25, 1, 25, 10 ],
"method" : {
"kind" : "MemberExpr",
"location" : [ 25, 1, 25, 7 ],
"object" : {
"kind" : "Identifier",
"location" : [ 25, 1, 25, 1 ],
"name" : "a"
},
"member" : {
"kind" : "Identifier",
"location" : [ 25, 3, 25, 7 ],
"name" : "get_A"
}
},
"args" : [ {
"kind" : "IntegerLiteral",
"location" : [ 25, 9, 25, 9 ],
"value" : 1
} ]
}
}, {
"kind" : "ExprStmt",
"location" : [ 26, 1, 26, 9 ],
"expr" : {
"kind" : "MethodCallExpr",
"location" : [ 26, 1, 26, 9 ],
"method" : {
"kind" : "MemberExpr",
"location" : [ 26, 1, 26, 7 ],
"object" : {
"kind" : "Identifier",
"location" : [ 26, 1, 26, 1 ],
"name" : "b"
},
"member" : {
"kind" : "Identifier",
"location" : [ 26, 3, 26, 7 ],
"name" : "get_Z"
}
},
"args" : [ ]
}
}, {
"kind" : "ExprStmt",
"location" : [ 27, 1, 27, 9 ],
"expr" : {
"kind" : "MethodCallExpr",
"location" : [ 27, 1, 27, 9 ],
"method" : {
"kind" : "MemberExpr",
"location" : [ 27, 1, 27, 7 ],
"object" : {
"kind" : "Identifier",
"location" : [ 27, 1, 27, 1 ],
"name" : "c"
},
"member" : {
"kind" : "Identifier",
"location" : [ 27, 3, 27, 7 ],
"name" : "set_A"
}
},
"args" : [ ]
}
}, {
"kind" : "ExprStmt",
"location" : [ 28, 1, 28, 14 ],
"expr" : {
"kind" : "MethodCallExpr",
"location" : [ 28, 1, 28, 14 ],
"method" : {
"kind" : "MemberExpr",
"location" : [ 28, 1, 28, 7 ],
"object" : {
"kind" : "Identifier",
"location" : [ 28, 1, 28, 1 ],
"name" : "c"
},
"member" : {
"kind" : "Identifier",
"location" : [ 28, 3, 28, 7 ],
"name" : "set_A"
}
},
"args" : [ {
"kind" : "BooleanLiteral",
"location" : [ 28, 9, 28, 13 ],
"value" : false
} ]
}
}, {
"kind" : "ExprStmt",
"location" : [ 29, 1, 29, 13 ],
"expr" : {
"kind" : "MethodCallExpr",
"location" : [ 29, 1, 29, 13 ],
"method" : {
"kind" : "MemberExpr",
"location" : [ 29, 1, 29, 7 ],
"object" : {
"kind" : "Identifier",
"location" : [ 29, 1, 29, 1 ],
"name" : "c"
},
"member" : {
"kind" : "Identifier",
"location" : [ 29, 3, 29, 7 ],
"name" : "set_A"
}
},
"args" : [ {
"kind" : "NoneLiteral",
"location" : [ 29, 9, 29, 12 ]
} ]
}
} ],
"errors" : {
"errors" : [ ],
"kind" : "Errors",
"location" : [ 0, 0, 0, 0 ]
}
}

@ -0,0 +1,668 @@
{
"kind" : "Program",
"location" : [ 1, 1, 29, 14 ],
"declarations" : [ {
"kind" : "ClassDef",
"location" : [ 1, 1, 7, 0 ],
"name" : {
"kind" : "Identifier",
"location" : [ 1, 7, 1, 7 ],
"name" : "A"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 1, 9, 1, 14 ],
"name" : "object"
},
"declarations" : [ {
"kind" : "VarDef",
"location" : [ 2, 5, 2, 13 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 2, 5, 2, 9 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 2, 5, 2, 5 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 2, 7, 2, 9 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 2, 13, 2, 13 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"value" : 1
}
}, {
"kind" : "FuncDef",
"location" : [ 4, 5, 5, 22 ],
"name" : {
"kind" : "Identifier",
"location" : [ 4, 9, 4, 13 ],
"name" : "get_A"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 4, 15, 4, 23 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 4, 15, 4, 18 ],
"name" : "self"
},
"type" : {
"kind" : "ClassType",
"location" : [ 4, 21, 4, 23 ],
"className" : "A"
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 4, 29, 4, 31 ],
"className" : "int"
},
"declarations" : [ ],
"statements" : [ {
"kind" : "ReturnStmt",
"location" : [ 5, 9, 5, 21 ],
"value" : {
"kind" : "MemberExpr",
"location" : [ 5, 16, 5, 21 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"object" : {
"kind" : "Identifier",
"location" : [ 5, 16, 5, 19 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "A"
},
"name" : "self"
},
"member" : {
"kind" : "Identifier",
"location" : [ 5, 21, 5, 21 ],
"name" : "x"
}
}
} ]
} ]
}, {
"kind" : "ClassDef",
"location" : [ 7, 1, 11, 0 ],
"name" : {
"kind" : "Identifier",
"location" : [ 7, 7, 7, 7 ],
"name" : "B"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 7, 9, 7, 9 ],
"name" : "A"
},
"declarations" : [ {
"kind" : "FuncDef",
"location" : [ 8, 5, 9, 13 ],
"name" : {
"kind" : "Identifier",
"location" : [ 8, 9, 8, 16 ],
"name" : "__init__"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 8, 18, 8, 26 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 8, 18, 8, 21 ],
"name" : "self"
},
"type" : {
"kind" : "ClassType",
"location" : [ 8, 24, 8, 26 ],
"className" : "B"
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 8, 28, 8, 28 ],
"className" : "<None>"
},
"declarations" : [ ],
"statements" : [ ]
} ]
}, {
"kind" : "ClassDef",
"location" : [ 11, 1, 17, 0 ],
"name" : {
"kind" : "Identifier",
"location" : [ 11, 7, 11, 7 ],
"name" : "C"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 11, 9, 11, 9 ],
"name" : "B"
},
"declarations" : [ {
"kind" : "VarDef",
"location" : [ 12, 5, 12, 17 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 12, 5, 12, 10 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 12, 5, 12, 5 ],
"name" : "z"
},
"type" : {
"kind" : "ClassType",
"location" : [ 12, 7, 12, 10 ],
"className" : "bool"
}
},
"value" : {
"kind" : "BooleanLiteral",
"location" : [ 12, 14, 12, 17 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "bool"
},
"value" : true
}
}, {
"kind" : "FuncDef",
"location" : [ 14, 5, 15, 21 ],
"name" : {
"kind" : "Identifier",
"location" : [ 14, 9, 14, 13 ],
"name" : "set_A"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 14, 15, 14, 23 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 14, 15, 14, 18 ],
"name" : "self"
},
"type" : {
"kind" : "ClassType",
"location" : [ 14, 21, 14, 23 ],
"className" : "C"
}
}, {
"kind" : "TypedVar",
"location" : [ 14, 26, 14, 33 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 14, 26, 14, 28 ],
"name" : "val"
},
"type" : {
"kind" : "ClassType",
"location" : [ 14, 31, 14, 33 ],
"className" : "int"
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 14, 39, 14, 44 ],
"className" : "object"
},
"declarations" : [ ],
"statements" : [ {
"kind" : "AssignStmt",
"location" : [ 15, 9, 15, 20 ],
"targets" : [ {
"kind" : "MemberExpr",
"location" : [ 15, 9, 15, 14 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"object" : {
"kind" : "Identifier",
"location" : [ 15, 9, 15, 12 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "C"
},
"name" : "self"
},
"member" : {
"kind" : "Identifier",
"location" : [ 15, 14, 15, 14 ],
"name" : "x"
}
} ],
"value" : {
"kind" : "Identifier",
"location" : [ 15, 18, 15, 20 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"name" : "val"
}
} ]
} ]
}, {
"kind" : "VarDef",
"location" : [ 17, 1, 17, 10 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 17, 1, 17, 3 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 17, 1, 17, 1 ],
"name" : "a"
},
"type" : {
"kind" : "ClassType",
"location" : [ 17, 3, 17, 3 ],
"className" : "A"
}
},
"value" : {
"kind" : "NoneLiteral",
"location" : [ 17, 7, 17, 10 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "<None>"
}
}
}, {
"kind" : "VarDef",
"location" : [ 18, 1, 18, 10 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 18, 1, 18, 3 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 18, 1, 18, 1 ],
"name" : "b"
},
"type" : {
"kind" : "ClassType",
"location" : [ 18, 3, 18, 3 ],
"className" : "B"
}
},
"value" : {
"kind" : "NoneLiteral",
"location" : [ 18, 7, 18, 10 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "<None>"
}
}
}, {
"kind" : "VarDef",
"location" : [ 19, 1, 19, 10 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 19, 1, 19, 3 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 19, 1, 19, 1 ],
"name" : "c"
},
"type" : {
"kind" : "ClassType",
"location" : [ 19, 3, 19, 3 ],
"className" : "C"
}
},
"value" : {
"kind" : "NoneLiteral",
"location" : [ 19, 7, 19, 10 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "<None>"
}
}
} ],
"statements" : [ {
"kind" : "AssignStmt",
"location" : [ 21, 1, 21, 7 ],
"targets" : [ {
"kind" : "Identifier",
"location" : [ 21, 1, 21, 1 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "A"
},
"name" : "a"
} ],
"value" : {
"kind" : "CallExpr",
"location" : [ 21, 5, 21, 7 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "A"
},
"function" : {
"kind" : "Identifier",
"location" : [ 21, 5, 21, 5 ],
"name" : "A"
},
"args" : [ ]
}
}, {
"kind" : "AssignStmt",
"location" : [ 22, 1, 22, 7 ],
"targets" : [ {
"kind" : "Identifier",
"location" : [ 22, 1, 22, 1 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "B"
},
"name" : "b"
} ],
"value" : {
"kind" : "CallExpr",
"location" : [ 22, 5, 22, 7 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "B"
},
"function" : {
"kind" : "Identifier",
"location" : [ 22, 5, 22, 5 ],
"name" : "B"
},
"args" : [ ]
}
}, {
"kind" : "AssignStmt",
"location" : [ 23, 1, 23, 7 ],
"targets" : [ {
"kind" : "Identifier",
"location" : [ 23, 1, 23, 1 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "C"
},
"name" : "c"
} ],
"value" : {
"kind" : "CallExpr",
"location" : [ 23, 5, 23, 7 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "C"
},
"function" : {
"kind" : "Identifier",
"location" : [ 23, 5, 23, 5 ],
"name" : "C"
},
"args" : [ ]
}
}, {
"kind" : "ExprStmt",
"location" : [ 25, 1, 25, 10 ],
"expr" : {
"kind" : "MethodCallExpr",
"location" : [ 25, 1, 25, 10 ],
"errorMsg" : "Expected 0 arguments; got 1",
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"method" : {
"kind" : "MemberExpr",
"location" : [ 25, 1, 25, 7 ],
"inferredType" : {
"kind" : "FuncType",
"parameters" : [ {
"kind" : "ClassValueType",
"className" : "A"
} ],
"returnType" : {
"kind" : "ClassValueType",
"className" : "int"
}
},
"object" : {
"kind" : "Identifier",
"location" : [ 25, 1, 25, 1 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "A"
},
"name" : "a"
},
"member" : {
"kind" : "Identifier",
"location" : [ 25, 3, 25, 7 ],
"name" : "get_A"
}
},
"args" : [ {
"kind" : "IntegerLiteral",
"location" : [ 25, 9, 25, 9 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"value" : 1
} ]
}
}, {
"kind" : "ExprStmt",
"location" : [ 26, 1, 26, 9 ],
"expr" : {
"kind" : "MethodCallExpr",
"location" : [ 26, 1, 26, 9 ],
"errorMsg" : "There is no method named `get_Z` in class `B`",
"inferredType" : {
"kind" : "ClassValueType",
"className" : "object"
},
"method" : {
"kind" : "MemberExpr",
"location" : [ 26, 1, 26, 7 ],
"object" : {
"kind" : "Identifier",
"location" : [ 26, 1, 26, 1 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "B"
},
"name" : "b"
},
"member" : {
"kind" : "Identifier",
"location" : [ 26, 3, 26, 7 ],
"name" : "get_Z"
}
},
"args" : [ ]
}
}, {
"kind" : "ExprStmt",
"location" : [ 27, 1, 27, 9 ],
"expr" : {
"kind" : "MethodCallExpr",
"location" : [ 27, 1, 27, 9 ],
"errorMsg" : "Expected 1 arguments; got 0",
"inferredType" : {
"kind" : "ClassValueType",
"className" : "object"
},
"method" : {
"kind" : "MemberExpr",
"location" : [ 27, 1, 27, 7 ],
"inferredType" : {
"kind" : "FuncType",
"parameters" : [ {
"kind" : "ClassValueType",
"className" : "C"
}, {
"kind" : "ClassValueType",
"className" : "int"
} ],
"returnType" : {
"kind" : "ClassValueType",
"className" : "object"
}
},
"object" : {
"kind" : "Identifier",
"location" : [ 27, 1, 27, 1 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "C"
},
"name" : "c"
},
"member" : {
"kind" : "Identifier",
"location" : [ 27, 3, 27, 7 ],
"name" : "set_A"
}
},
"args" : [ ]
}
}, {
"kind" : "ExprStmt",
"location" : [ 28, 1, 28, 14 ],
"expr" : {
"kind" : "MethodCallExpr",
"location" : [ 28, 1, 28, 14 ],
"errorMsg" : "Expected type `int`; got type `bool` in parameter 1",
"inferredType" : {
"kind" : "ClassValueType",
"className" : "object"
},
"method" : {
"kind" : "MemberExpr",
"location" : [ 28, 1, 28, 7 ],
"inferredType" : {
"kind" : "FuncType",
"parameters" : [ {
"kind" : "ClassValueType",
"className" : "C"
}, {
"kind" : "ClassValueType",
"className" : "int"
} ],
"returnType" : {
"kind" : "ClassValueType",
"className" : "object"
}
},
"object" : {
"kind" : "Identifier",
"location" : [ 28, 1, 28, 1 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "C"
},
"name" : "c"
},
"member" : {
"kind" : "Identifier",
"location" : [ 28, 3, 28, 7 ],
"name" : "set_A"
}
},
"args" : [ {
"kind" : "BooleanLiteral",
"location" : [ 28, 9, 28, 13 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "bool"
},
"value" : false
} ]
}
}, {
"kind" : "ExprStmt",
"location" : [ 29, 1, 29, 13 ],
"expr" : {
"kind" : "MethodCallExpr",
"location" : [ 29, 1, 29, 13 ],
"errorMsg" : "Expected type `int`; got type `<None>` in parameter 1",
"inferredType" : {
"kind" : "ClassValueType",
"className" : "object"
},
"method" : {
"kind" : "MemberExpr",
"location" : [ 29, 1, 29, 7 ],
"inferredType" : {
"kind" : "FuncType",
"parameters" : [ {
"kind" : "ClassValueType",
"className" : "C"
}, {
"kind" : "ClassValueType",
"className" : "int"
} ],
"returnType" : {
"kind" : "ClassValueType",
"className" : "object"
}
},
"object" : {
"kind" : "Identifier",
"location" : [ 29, 1, 29, 1 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "C"
},
"name" : "c"
},
"member" : {
"kind" : "Identifier",
"location" : [ 29, 3, 29, 7 ],
"name" : "set_A"
}
},
"args" : [ {
"kind" : "NoneLiteral",
"location" : [ 29, 9, 29, 12 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "<None>"
}
} ]
}
} ],
"errors" : {
"errors" : [ {
"kind" : "CompilerError",
"location" : [ 25, 1, 25, 10 ],
"message" : "Expected 0 arguments; got 1"
}, {
"kind" : "CompilerError",
"location" : [ 26, 1, 26, 9 ],
"message" : "There is no method named `get_Z` in class `B`"
}, {
"kind" : "CompilerError",
"location" : [ 27, 1, 27, 9 ],
"message" : "Expected 1 arguments; got 0"
}, {
"kind" : "CompilerError",
"location" : [ 28, 1, 28, 14 ],
"message" : "Expected type `int`; got type `bool` in parameter 1"
}, {
"kind" : "CompilerError",
"location" : [ 29, 1, 29, 13 ],
"message" : "Expected type `int`; got type `<None>` in parameter 1"
} ],
"kind" : "Errors",
"location" : [ 0, 0, 0, 0 ]
}
}

@ -0,0 +1,33 @@
class A(object):
def foo(self:"A", x:int) -> int:
return x
def bar(self:"A", x:int) -> int:
return x
def baz(self:"A", x:int) -> int:
return x
def qux(self:"A", x:int) -> int:
return x
class B(A):
# OK override
def foo(self:"B", x:int) -> int:
return 0
# Bad override
def bar(self:"B") -> int:
return 0
# Bad override
def baz(self:"B", x:int) -> bool:
return True
# Bad override
def qux(self:"B", x:bool) -> int:
return 0
B()

@ -0,0 +1,439 @@
{
"kind" : "Program",
"location" : [ 1, 1, 32, 4 ],
"declarations" : [ {
"kind" : "ClassDef",
"location" : [ 1, 1, 14, 0 ],
"name" : {
"kind" : "Identifier",
"location" : [ 1, 7, 1, 7 ],
"name" : "A"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 1, 9, 1, 14 ],
"name" : "object"
},
"declarations" : [ {
"kind" : "FuncDef",
"location" : [ 2, 5, 3, 17 ],
"name" : {
"kind" : "Identifier",
"location" : [ 2, 9, 2, 11 ],
"name" : "foo"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 2, 13, 2, 20 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 2, 13, 2, 16 ],
"name" : "self"
},
"type" : {
"kind" : "ClassType",
"location" : [ 2, 18, 2, 20 ],
"className" : "A"
}
}, {
"kind" : "TypedVar",
"location" : [ 2, 23, 2, 27 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 2, 23, 2, 23 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 2, 25, 2, 27 ],
"className" : "int"
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 2, 33, 2, 35 ],
"className" : "int"
},
"declarations" : [ ],
"statements" : [ {
"kind" : "ReturnStmt",
"location" : [ 3, 9, 3, 16 ],
"value" : {
"kind" : "Identifier",
"location" : [ 3, 16, 3, 16 ],
"name" : "x"
}
} ]
}, {
"kind" : "FuncDef",
"location" : [ 5, 5, 6, 17 ],
"name" : {
"kind" : "Identifier",
"location" : [ 5, 9, 5, 11 ],
"name" : "bar"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 5, 13, 5, 20 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 5, 13, 5, 16 ],
"name" : "self"
},
"type" : {
"kind" : "ClassType",
"location" : [ 5, 18, 5, 20 ],
"className" : "A"
}
}, {
"kind" : "TypedVar",
"location" : [ 5, 23, 5, 27 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 5, 23, 5, 23 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 5, 25, 5, 27 ],
"className" : "int"
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 5, 33, 5, 35 ],
"className" : "int"
},
"declarations" : [ ],
"statements" : [ {
"kind" : "ReturnStmt",
"location" : [ 6, 9, 6, 16 ],
"value" : {
"kind" : "Identifier",
"location" : [ 6, 16, 6, 16 ],
"name" : "x"
}
} ]
}, {
"kind" : "FuncDef",
"location" : [ 8, 5, 9, 17 ],
"name" : {
"kind" : "Identifier",
"location" : [ 8, 9, 8, 11 ],
"name" : "baz"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 8, 13, 8, 20 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 8, 13, 8, 16 ],
"name" : "self"
},
"type" : {
"kind" : "ClassType",
"location" : [ 8, 18, 8, 20 ],
"className" : "A"
}
}, {
"kind" : "TypedVar",
"location" : [ 8, 23, 8, 27 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 8, 23, 8, 23 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 8, 25, 8, 27 ],
"className" : "int"
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 8, 33, 8, 35 ],
"className" : "int"
},
"declarations" : [ ],
"statements" : [ {
"kind" : "ReturnStmt",
"location" : [ 9, 9, 9, 16 ],
"value" : {
"kind" : "Identifier",
"location" : [ 9, 16, 9, 16 ],
"name" : "x"
}
} ]
}, {
"kind" : "FuncDef",
"location" : [ 11, 5, 12, 17 ],
"name" : {
"kind" : "Identifier",
"location" : [ 11, 9, 11, 11 ],
"name" : "qux"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 11, 13, 11, 20 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 11, 13, 11, 16 ],
"name" : "self"
},
"type" : {
"kind" : "ClassType",
"location" : [ 11, 18, 11, 20 ],
"className" : "A"
}
}, {
"kind" : "TypedVar",
"location" : [ 11, 23, 11, 27 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 11, 23, 11, 23 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 11, 25, 11, 27 ],
"className" : "int"
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 11, 33, 11, 35 ],
"className" : "int"
},
"declarations" : [ ],
"statements" : [ {
"kind" : "ReturnStmt",
"location" : [ 12, 9, 12, 16 ],
"value" : {
"kind" : "Identifier",
"location" : [ 12, 16, 12, 16 ],
"name" : "x"
}
} ]
} ]
}, {
"kind" : "ClassDef",
"location" : [ 14, 1, 32, 0 ],
"name" : {
"kind" : "Identifier",
"location" : [ 14, 7, 14, 7 ],
"name" : "B"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 14, 9, 14, 9 ],
"name" : "A"
},
"declarations" : [ {
"kind" : "FuncDef",
"location" : [ 17, 5, 18, 17 ],
"name" : {
"kind" : "Identifier",
"location" : [ 17, 9, 17, 11 ],
"name" : "foo"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 17, 13, 17, 20 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 17, 13, 17, 16 ],
"name" : "self"
},
"type" : {
"kind" : "ClassType",
"location" : [ 17, 18, 17, 20 ],
"className" : "B"
}
}, {
"kind" : "TypedVar",
"location" : [ 17, 23, 17, 27 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 17, 23, 17, 23 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 17, 25, 17, 27 ],
"className" : "int"
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 17, 33, 17, 35 ],
"className" : "int"
},
"declarations" : [ ],
"statements" : [ {
"kind" : "ReturnStmt",
"location" : [ 18, 9, 18, 16 ],
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 18, 16, 18, 16 ],
"value" : 0
}
} ]
}, {
"kind" : "FuncDef",
"location" : [ 21, 5, 22, 17 ],
"name" : {
"kind" : "Identifier",
"location" : [ 21, 9, 21, 11 ],
"name" : "bar"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 21, 13, 21, 20 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 21, 13, 21, 16 ],
"name" : "self"
},
"type" : {
"kind" : "ClassType",
"location" : [ 21, 18, 21, 20 ],
"className" : "B"
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 21, 26, 21, 28 ],
"className" : "int"
},
"declarations" : [ ],
"statements" : [ {
"kind" : "ReturnStmt",
"location" : [ 22, 9, 22, 16 ],
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 22, 16, 22, 16 ],
"value" : 0
}
} ]
}, {
"kind" : "FuncDef",
"location" : [ 25, 5, 26, 20 ],
"name" : {
"kind" : "Identifier",
"location" : [ 25, 9, 25, 11 ],
"name" : "baz"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 25, 13, 25, 20 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 25, 13, 25, 16 ],
"name" : "self"
},
"type" : {
"kind" : "ClassType",
"location" : [ 25, 18, 25, 20 ],
"className" : "B"
}
}, {
"kind" : "TypedVar",
"location" : [ 25, 23, 25, 27 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 25, 23, 25, 23 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 25, 25, 25, 27 ],
"className" : "int"
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 25, 33, 25, 36 ],
"className" : "bool"
},
"declarations" : [ ],
"statements" : [ {
"kind" : "ReturnStmt",
"location" : [ 26, 9, 26, 19 ],
"value" : {
"kind" : "BooleanLiteral",
"location" : [ 26, 16, 26, 19 ],
"value" : true
}
} ]
}, {
"kind" : "FuncDef",
"location" : [ 29, 5, 30, 17 ],
"name" : {
"kind" : "Identifier",
"location" : [ 29, 9, 29, 11 ],
"name" : "qux"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 29, 13, 29, 20 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 29, 13, 29, 16 ],
"name" : "self"
},
"type" : {
"kind" : "ClassType",
"location" : [ 29, 18, 29, 20 ],
"className" : "B"
}
}, {
"kind" : "TypedVar",
"location" : [ 29, 23, 29, 28 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 29, 23, 29, 23 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 29, 25, 29, 28 ],
"className" : "bool"
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 29, 34, 29, 36 ],
"className" : "int"
},
"declarations" : [ ],
"statements" : [ {
"kind" : "ReturnStmt",
"location" : [ 30, 9, 30, 16 ],
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 30, 16, 30, 16 ],
"value" : 0
}
} ]
} ]
} ],
"statements" : [ {
"kind" : "ExprStmt",
"location" : [ 32, 1, 32, 3 ],
"expr" : {
"kind" : "CallExpr",
"location" : [ 32, 1, 32, 3 ],
"function" : {
"kind" : "Identifier",
"location" : [ 32, 1, 32, 1 ],
"name" : "B"
},
"args" : [ ]
}
} ],
"errors" : {
"errors" : [ ],
"kind" : "Errors",
"location" : [ 0, 0, 0, 0 ]
}
}

@ -0,0 +1,454 @@
{
"kind" : "Program",
"location" : [ 1, 1, 32, 4 ],
"declarations" : [ {
"kind" : "ClassDef",
"location" : [ 1, 1, 14, 0 ],
"name" : {
"kind" : "Identifier",
"location" : [ 1, 7, 1, 7 ],
"name" : "A"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 1, 9, 1, 14 ],
"name" : "object"
},
"declarations" : [ {
"kind" : "FuncDef",
"location" : [ 2, 5, 3, 17 ],
"name" : {
"kind" : "Identifier",
"location" : [ 2, 9, 2, 11 ],
"name" : "foo"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 2, 13, 2, 20 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 2, 13, 2, 16 ],
"name" : "self"
},
"type" : {
"kind" : "ClassType",
"location" : [ 2, 18, 2, 20 ],
"className" : "A"
}
}, {
"kind" : "TypedVar",
"location" : [ 2, 23, 2, 27 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 2, 23, 2, 23 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 2, 25, 2, 27 ],
"className" : "int"
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 2, 33, 2, 35 ],
"className" : "int"
},
"declarations" : [ ],
"statements" : [ {
"kind" : "ReturnStmt",
"location" : [ 3, 9, 3, 16 ],
"value" : {
"kind" : "Identifier",
"location" : [ 3, 16, 3, 16 ],
"name" : "x"
}
} ]
}, {
"kind" : "FuncDef",
"location" : [ 5, 5, 6, 17 ],
"name" : {
"kind" : "Identifier",
"location" : [ 5, 9, 5, 11 ],
"name" : "bar"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 5, 13, 5, 20 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 5, 13, 5, 16 ],
"name" : "self"
},
"type" : {
"kind" : "ClassType",
"location" : [ 5, 18, 5, 20 ],
"className" : "A"
}
}, {
"kind" : "TypedVar",
"location" : [ 5, 23, 5, 27 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 5, 23, 5, 23 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 5, 25, 5, 27 ],
"className" : "int"
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 5, 33, 5, 35 ],
"className" : "int"
},
"declarations" : [ ],
"statements" : [ {
"kind" : "ReturnStmt",
"location" : [ 6, 9, 6, 16 ],
"value" : {
"kind" : "Identifier",
"location" : [ 6, 16, 6, 16 ],
"name" : "x"
}
} ]
}, {
"kind" : "FuncDef",
"location" : [ 8, 5, 9, 17 ],
"name" : {
"kind" : "Identifier",
"location" : [ 8, 9, 8, 11 ],
"name" : "baz"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 8, 13, 8, 20 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 8, 13, 8, 16 ],
"name" : "self"
},
"type" : {
"kind" : "ClassType",
"location" : [ 8, 18, 8, 20 ],
"className" : "A"
}
}, {
"kind" : "TypedVar",
"location" : [ 8, 23, 8, 27 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 8, 23, 8, 23 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 8, 25, 8, 27 ],
"className" : "int"
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 8, 33, 8, 35 ],
"className" : "int"
},
"declarations" : [ ],
"statements" : [ {
"kind" : "ReturnStmt",
"location" : [ 9, 9, 9, 16 ],
"value" : {
"kind" : "Identifier",
"location" : [ 9, 16, 9, 16 ],
"name" : "x"
}
} ]
}, {
"kind" : "FuncDef",
"location" : [ 11, 5, 12, 17 ],
"name" : {
"kind" : "Identifier",
"location" : [ 11, 9, 11, 11 ],
"name" : "qux"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 11, 13, 11, 20 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 11, 13, 11, 16 ],
"name" : "self"
},
"type" : {
"kind" : "ClassType",
"location" : [ 11, 18, 11, 20 ],
"className" : "A"
}
}, {
"kind" : "TypedVar",
"location" : [ 11, 23, 11, 27 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 11, 23, 11, 23 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 11, 25, 11, 27 ],
"className" : "int"
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 11, 33, 11, 35 ],
"className" : "int"
},
"declarations" : [ ],
"statements" : [ {
"kind" : "ReturnStmt",
"location" : [ 12, 9, 12, 16 ],
"value" : {
"kind" : "Identifier",
"location" : [ 12, 16, 12, 16 ],
"name" : "x"
}
} ]
} ]
}, {
"kind" : "ClassDef",
"location" : [ 14, 1, 32, 0 ],
"name" : {
"kind" : "Identifier",
"location" : [ 14, 7, 14, 7 ],
"name" : "B"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 14, 9, 14, 9 ],
"name" : "A"
},
"declarations" : [ {
"kind" : "FuncDef",
"location" : [ 17, 5, 18, 17 ],
"name" : {
"kind" : "Identifier",
"location" : [ 17, 9, 17, 11 ],
"name" : "foo"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 17, 13, 17, 20 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 17, 13, 17, 16 ],
"name" : "self"
},
"type" : {
"kind" : "ClassType",
"location" : [ 17, 18, 17, 20 ],
"className" : "B"
}
}, {
"kind" : "TypedVar",
"location" : [ 17, 23, 17, 27 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 17, 23, 17, 23 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 17, 25, 17, 27 ],
"className" : "int"
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 17, 33, 17, 35 ],
"className" : "int"
},
"declarations" : [ ],
"statements" : [ {
"kind" : "ReturnStmt",
"location" : [ 18, 9, 18, 16 ],
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 18, 16, 18, 16 ],
"value" : 0
}
} ]
}, {
"kind" : "FuncDef",
"location" : [ 21, 5, 22, 17 ],
"name" : {
"kind" : "Identifier",
"location" : [ 21, 9, 21, 11 ],
"errorMsg" : "Method overridden with different type signature: bar",
"name" : "bar"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 21, 13, 21, 20 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 21, 13, 21, 16 ],
"name" : "self"
},
"type" : {
"kind" : "ClassType",
"location" : [ 21, 18, 21, 20 ],
"className" : "B"
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 21, 26, 21, 28 ],
"className" : "int"
},
"declarations" : [ ],
"statements" : [ {
"kind" : "ReturnStmt",
"location" : [ 22, 9, 22, 16 ],
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 22, 16, 22, 16 ],
"value" : 0
}
} ]
}, {
"kind" : "FuncDef",
"location" : [ 25, 5, 26, 20 ],
"name" : {
"kind" : "Identifier",
"location" : [ 25, 9, 25, 11 ],
"errorMsg" : "Method overridden with different type signature: baz",
"name" : "baz"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 25, 13, 25, 20 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 25, 13, 25, 16 ],
"name" : "self"
},
"type" : {
"kind" : "ClassType",
"location" : [ 25, 18, 25, 20 ],
"className" : "B"
}
}, {
"kind" : "TypedVar",
"location" : [ 25, 23, 25, 27 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 25, 23, 25, 23 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 25, 25, 25, 27 ],
"className" : "int"
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 25, 33, 25, 36 ],
"className" : "bool"
},
"declarations" : [ ],
"statements" : [ {
"kind" : "ReturnStmt",
"location" : [ 26, 9, 26, 19 ],
"value" : {
"kind" : "BooleanLiteral",
"location" : [ 26, 16, 26, 19 ],
"value" : true
}
} ]
}, {
"kind" : "FuncDef",
"location" : [ 29, 5, 30, 17 ],
"name" : {
"kind" : "Identifier",
"location" : [ 29, 9, 29, 11 ],
"errorMsg" : "Method overridden with different type signature: qux",
"name" : "qux"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 29, 13, 29, 20 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 29, 13, 29, 16 ],
"name" : "self"
},
"type" : {
"kind" : "ClassType",
"location" : [ 29, 18, 29, 20 ],
"className" : "B"
}
}, {
"kind" : "TypedVar",
"location" : [ 29, 23, 29, 28 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 29, 23, 29, 23 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 29, 25, 29, 28 ],
"className" : "bool"
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 29, 34, 29, 36 ],
"className" : "int"
},
"declarations" : [ ],
"statements" : [ {
"kind" : "ReturnStmt",
"location" : [ 30, 9, 30, 16 ],
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 30, 16, 30, 16 ],
"value" : 0
}
} ]
} ]
} ],
"statements" : [ {
"kind" : "ExprStmt",
"location" : [ 32, 1, 32, 3 ],
"expr" : {
"kind" : "CallExpr",
"location" : [ 32, 1, 32, 3 ],
"function" : {
"kind" : "Identifier",
"location" : [ 32, 1, 32, 1 ],
"name" : "B"
},
"args" : [ ]
}
} ],
"errors" : {
"errors" : [ {
"kind" : "CompilerError",
"location" : [ 21, 9, 21, 11 ],
"message" : "Method overridden with different type signature: bar"
}, {
"kind" : "CompilerError",
"location" : [ 25, 9, 25, 11 ],
"message" : "Method overridden with different type signature: baz"
}, {
"kind" : "CompilerError",
"location" : [ 29, 9, 29, 11 ],
"message" : "Method overridden with different type signature: qux"
} ],
"kind" : "Errors",
"location" : [ 0, 0, 0, 0 ]
}
}

@ -0,0 +1,8 @@
class A(object):
f:int = 3
class B(A):
def f(self:B) -> int:
return 3
A()

@ -0,0 +1,111 @@
{
"kind" : "Program",
"location" : [ 1, 1, 8, 4 ],
"declarations" : [ {
"kind" : "ClassDef",
"location" : [ 1, 1, 2, 11 ],
"name" : {
"kind" : "Identifier",
"location" : [ 1, 7, 1, 7 ],
"name" : "A"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 1, 9, 1, 14 ],
"name" : "object"
},
"declarations" : [ {
"kind" : "VarDef",
"location" : [ 2, 2, 2, 10 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 2, 2, 2, 6 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 2, 2, 2, 2 ],
"name" : "f"
},
"type" : {
"kind" : "ClassType",
"location" : [ 2, 4, 2, 6 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 2, 10, 2, 10 ],
"value" : 3
}
} ]
}, {
"kind" : "ClassDef",
"location" : [ 4, 1, 8, 0 ],
"name" : {
"kind" : "Identifier",
"location" : [ 4, 7, 4, 7 ],
"name" : "B"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 4, 9, 4, 9 ],
"name" : "A"
},
"declarations" : [ {
"kind" : "FuncDef",
"location" : [ 5, 2, 6, 11 ],
"name" : {
"kind" : "Identifier",
"location" : [ 5, 6, 5, 6 ],
"name" : "f"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 5, 8, 5, 13 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 5, 8, 5, 11 ],
"name" : "self"
},
"type" : {
"kind" : "ClassType",
"location" : [ 5, 13, 5, 13 ],
"className" : "B"
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 5, 19, 5, 21 ],
"className" : "int"
},
"declarations" : [ ],
"statements" : [ {
"kind" : "ReturnStmt",
"location" : [ 6, 3, 6, 10 ],
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 6, 10, 6, 10 ],
"value" : 3
}
} ]
} ]
} ],
"statements" : [ {
"kind" : "ExprStmt",
"location" : [ 8, 1, 8, 3 ],
"expr" : {
"kind" : "CallExpr",
"location" : [ 8, 1, 8, 3 ],
"function" : {
"kind" : "Identifier",
"location" : [ 8, 1, 8, 1 ],
"name" : "A"
},
"args" : [ ]
}
} ],
"errors" : {
"errors" : [ ],
"kind" : "Errors",
"location" : [ 0, 0, 0, 0 ]
}
}

@ -0,0 +1,116 @@
{
"kind" : "Program",
"location" : [ 1, 1, 8, 4 ],
"declarations" : [ {
"kind" : "ClassDef",
"location" : [ 1, 1, 2, 11 ],
"name" : {
"kind" : "Identifier",
"location" : [ 1, 7, 1, 7 ],
"name" : "A"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 1, 9, 1, 14 ],
"name" : "object"
},
"declarations" : [ {
"kind" : "VarDef",
"location" : [ 2, 2, 2, 10 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 2, 2, 2, 6 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 2, 2, 2, 2 ],
"name" : "f"
},
"type" : {
"kind" : "ClassType",
"location" : [ 2, 4, 2, 6 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 2, 10, 2, 10 ],
"value" : 3
}
} ]
}, {
"kind" : "ClassDef",
"location" : [ 4, 1, 8, 0 ],
"name" : {
"kind" : "Identifier",
"location" : [ 4, 7, 4, 7 ],
"name" : "B"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 4, 9, 4, 9 ],
"name" : "A"
},
"declarations" : [ {
"kind" : "FuncDef",
"location" : [ 5, 2, 6, 11 ],
"name" : {
"kind" : "Identifier",
"location" : [ 5, 6, 5, 6 ],
"errorMsg" : "Cannot re-define attribute: f",
"name" : "f"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 5, 8, 5, 13 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 5, 8, 5, 11 ],
"name" : "self"
},
"type" : {
"kind" : "ClassType",
"location" : [ 5, 13, 5, 13 ],
"className" : "B"
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 5, 19, 5, 21 ],
"className" : "int"
},
"declarations" : [ ],
"statements" : [ {
"kind" : "ReturnStmt",
"location" : [ 6, 3, 6, 10 ],
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 6, 10, 6, 10 ],
"value" : 3
}
} ]
} ]
} ],
"statements" : [ {
"kind" : "ExprStmt",
"location" : [ 8, 1, 8, 3 ],
"expr" : {
"kind" : "CallExpr",
"location" : [ 8, 1, 8, 3 ],
"function" : {
"kind" : "Identifier",
"location" : [ 8, 1, 8, 1 ],
"name" : "A"
},
"args" : [ ]
}
} ],
"errors" : {
"errors" : [ {
"kind" : "CompilerError",
"location" : [ 5, 6, 5, 6 ],
"message" : "Cannot re-define attribute: f"
} ],
"kind" : "Errors",
"location" : [ 0, 0, 0, 0 ]
}
}

@ -0,0 +1,15 @@
# Super is not defined
class A(B):
x:int = 1
z:int = 2
# Super is not a class
class B(z):
x:int = 1
# Cannot extend special classes
class C(int):
x:int = 1
A()

@ -0,0 +1,154 @@
{
"kind" : "Program",
"location" : [ 2, 1, 15, 4 ],
"declarations" : [ {
"kind" : "ClassDef",
"location" : [ 2, 1, 3, 14 ],
"name" : {
"kind" : "Identifier",
"location" : [ 2, 7, 2, 7 ],
"name" : "A"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 2, 9, 2, 9 ],
"name" : "B"
},
"declarations" : [ {
"kind" : "VarDef",
"location" : [ 3, 5, 3, 13 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 3, 5, 3, 9 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 3, 5, 3, 5 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 3, 7, 3, 9 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 3, 13, 3, 13 ],
"value" : 1
}
} ]
}, {
"kind" : "VarDef",
"location" : [ 5, 1, 5, 9 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 5, 1, 5, 5 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 5, 1, 5, 1 ],
"name" : "z"
},
"type" : {
"kind" : "ClassType",
"location" : [ 5, 3, 5, 5 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 5, 9, 5, 9 ],
"value" : 2
}
}, {
"kind" : "ClassDef",
"location" : [ 8, 1, 9, 14 ],
"name" : {
"kind" : "Identifier",
"location" : [ 8, 7, 8, 7 ],
"name" : "B"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 8, 9, 8, 9 ],
"name" : "z"
},
"declarations" : [ {
"kind" : "VarDef",
"location" : [ 9, 5, 9, 13 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 9, 5, 9, 9 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 9, 5, 9, 5 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 9, 7, 9, 9 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 9, 13, 9, 13 ],
"value" : 1
}
} ]
}, {
"kind" : "ClassDef",
"location" : [ 12, 1, 13, 14 ],
"name" : {
"kind" : "Identifier",
"location" : [ 12, 7, 12, 7 ],
"name" : "C"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 12, 9, 12, 11 ],
"name" : "int"
},
"declarations" : [ {
"kind" : "VarDef",
"location" : [ 13, 5, 13, 13 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 13, 5, 13, 9 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 13, 5, 13, 5 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 13, 7, 13, 9 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 13, 13, 13, 13 ],
"value" : 1
}
} ]
} ],
"statements" : [ {
"kind" : "ExprStmt",
"location" : [ 15, 1, 15, 3 ],
"expr" : {
"kind" : "CallExpr",
"location" : [ 15, 1, 15, 3 ],
"function" : {
"kind" : "Identifier",
"location" : [ 15, 1, 15, 1 ],
"name" : "A"
},
"args" : [ ]
}
} ],
"errors" : {
"errors" : [ ],
"kind" : "Errors",
"location" : [ 0, 0, 0, 0 ]
}
}

@ -0,0 +1,169 @@
{
"kind" : "Program",
"location" : [ 2, 1, 15, 4 ],
"declarations" : [ {
"kind" : "ClassDef",
"location" : [ 2, 1, 3, 14 ],
"name" : {
"kind" : "Identifier",
"location" : [ 2, 7, 2, 7 ],
"name" : "A"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 2, 9, 2, 9 ],
"errorMsg" : "Super-class not defined: B",
"name" : "B"
},
"declarations" : [ {
"kind" : "VarDef",
"location" : [ 3, 5, 3, 13 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 3, 5, 3, 9 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 3, 5, 3, 5 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 3, 7, 3, 9 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 3, 13, 3, 13 ],
"value" : 1
}
} ]
}, {
"kind" : "VarDef",
"location" : [ 5, 1, 5, 9 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 5, 1, 5, 5 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 5, 1, 5, 1 ],
"name" : "z"
},
"type" : {
"kind" : "ClassType",
"location" : [ 5, 3, 5, 5 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 5, 9, 5, 9 ],
"value" : 2
}
}, {
"kind" : "ClassDef",
"location" : [ 8, 1, 9, 14 ],
"name" : {
"kind" : "Identifier",
"location" : [ 8, 7, 8, 7 ],
"name" : "B"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 8, 9, 8, 9 ],
"errorMsg" : "Super-class must be a class: z",
"name" : "z"
},
"declarations" : [ {
"kind" : "VarDef",
"location" : [ 9, 5, 9, 13 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 9, 5, 9, 9 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 9, 5, 9, 5 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 9, 7, 9, 9 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 9, 13, 9, 13 ],
"value" : 1
}
} ]
}, {
"kind" : "ClassDef",
"location" : [ 12, 1, 13, 14 ],
"name" : {
"kind" : "Identifier",
"location" : [ 12, 7, 12, 7 ],
"name" : "C"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 12, 9, 12, 11 ],
"errorMsg" : "Cannot extend special class: int",
"name" : "int"
},
"declarations" : [ {
"kind" : "VarDef",
"location" : [ 13, 5, 13, 13 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 13, 5, 13, 9 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 13, 5, 13, 5 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 13, 7, 13, 9 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 13, 13, 13, 13 ],
"value" : 1
}
} ]
} ],
"statements" : [ {
"kind" : "ExprStmt",
"location" : [ 15, 1, 15, 3 ],
"expr" : {
"kind" : "CallExpr",
"location" : [ 15, 1, 15, 3 ],
"function" : {
"kind" : "Identifier",
"location" : [ 15, 1, 15, 1 ],
"name" : "A"
},
"args" : [ ]
}
} ],
"errors" : {
"errors" : [ {
"kind" : "CompilerError",
"location" : [ 2, 9, 2, 9 ],
"message" : "Super-class not defined: B"
}, {
"kind" : "CompilerError",
"location" : [ 8, 9, 8, 9 ],
"message" : "Super-class must be a class: z"
}, {
"kind" : "CompilerError",
"location" : [ 12, 9, 12, 11 ],
"message" : "Cannot extend special class: int"
} ],
"kind" : "Errors",
"location" : [ 0, 0, 0, 0 ]
}
}

@ -0,0 +1,3 @@
"Hello" + ["World"]
1 + [2]
[] + [1]

@ -0,0 +1,77 @@
{
"kind" : "Program",
"location" : [ 1, 1, 3, 9 ],
"declarations" : [ ],
"statements" : [ {
"kind" : "ExprStmt",
"location" : [ 1, 1, 1, 19 ],
"expr" : {
"kind" : "BinaryExpr",
"location" : [ 1, 1, 1, 19 ],
"left" : {
"kind" : "StringLiteral",
"location" : [ 1, 1, 1, 7 ],
"value" : "Hello"
},
"operator" : "+",
"right" : {
"kind" : "ListExpr",
"location" : [ 1, 11, 1, 19 ],
"elements" : [ {
"kind" : "StringLiteral",
"location" : [ 1, 12, 1, 18 ],
"value" : "World"
} ]
}
}
}, {
"kind" : "ExprStmt",
"location" : [ 2, 1, 2, 7 ],
"expr" : {
"kind" : "BinaryExpr",
"location" : [ 2, 1, 2, 7 ],
"left" : {
"kind" : "IntegerLiteral",
"location" : [ 2, 1, 2, 1 ],
"value" : 1
},
"operator" : "+",
"right" : {
"kind" : "ListExpr",
"location" : [ 2, 5, 2, 7 ],
"elements" : [ {
"kind" : "IntegerLiteral",
"location" : [ 2, 6, 2, 6 ],
"value" : 2
} ]
}
}
}, {
"kind" : "ExprStmt",
"location" : [ 3, 1, 3, 8 ],
"expr" : {
"kind" : "BinaryExpr",
"location" : [ 3, 1, 3, 8 ],
"left" : {
"kind" : "ListExpr",
"location" : [ 3, 1, 3, 2 ],
"elements" : [ ]
},
"operator" : "+",
"right" : {
"kind" : "ListExpr",
"location" : [ 3, 6, 3, 8 ],
"elements" : [ {
"kind" : "IntegerLiteral",
"location" : [ 3, 7, 3, 7 ],
"value" : 1
} ]
}
}
} ],
"errors" : {
"errors" : [ ],
"kind" : "Errors",
"location" : [ 0, 0, 0, 0 ]
}
}

@ -0,0 +1,149 @@
{
"kind" : "Program",
"location" : [ 1, 1, 3, 9 ],
"declarations" : [ ],
"statements" : [ {
"kind" : "ExprStmt",
"location" : [ 1, 1, 1, 19 ],
"expr" : {
"kind" : "BinaryExpr",
"location" : [ 1, 1, 1, 19 ],
"errorMsg" : "Cannot apply operator `+` on types `str` and `[str]`",
"inferredType" : {
"kind" : "ClassValueType",
"className" : "object"
},
"left" : {
"kind" : "StringLiteral",
"location" : [ 1, 1, 1, 7 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "str"
},
"value" : "Hello"
},
"operator" : "+",
"right" : {
"kind" : "ListExpr",
"location" : [ 1, 11, 1, 19 ],
"inferredType" : {
"kind" : "ListValueType",
"elementType" : {
"kind" : "ClassValueType",
"className" : "str"
}
},
"elements" : [ {
"kind" : "StringLiteral",
"location" : [ 1, 12, 1, 18 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "str"
},
"value" : "World"
} ]
}
}
}, {
"kind" : "ExprStmt",
"location" : [ 2, 1, 2, 7 ],
"expr" : {
"kind" : "BinaryExpr",
"location" : [ 2, 1, 2, 7 ],
"errorMsg" : "Cannot apply operator `+` on types `int` and `[int]`",
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"left" : {
"kind" : "IntegerLiteral",
"location" : [ 2, 1, 2, 1 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"value" : 1
},
"operator" : "+",
"right" : {
"kind" : "ListExpr",
"location" : [ 2, 5, 2, 7 ],
"inferredType" : {
"kind" : "ListValueType",
"elementType" : {
"kind" : "ClassValueType",
"className" : "int"
}
},
"elements" : [ {
"kind" : "IntegerLiteral",
"location" : [ 2, 6, 2, 6 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"value" : 2
} ]
}
}
}, {
"kind" : "ExprStmt",
"location" : [ 3, 1, 3, 8 ],
"expr" : {
"kind" : "BinaryExpr",
"location" : [ 3, 1, 3, 8 ],
"errorMsg" : "Cannot apply operator `+` on types `<Empty>` and `[int]`",
"inferredType" : {
"kind" : "ClassValueType",
"className" : "object"
},
"left" : {
"kind" : "ListExpr",
"location" : [ 3, 1, 3, 2 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "<Empty>"
},
"elements" : [ ]
},
"operator" : "+",
"right" : {
"kind" : "ListExpr",
"location" : [ 3, 6, 3, 8 ],
"inferredType" : {
"kind" : "ListValueType",
"elementType" : {
"kind" : "ClassValueType",
"className" : "int"
}
},
"elements" : [ {
"kind" : "IntegerLiteral",
"location" : [ 3, 7, 3, 7 ],
"inferredType" : {
"kind" : "ClassValueType",
"className" : "int"
},
"value" : 1
} ]
}
}
} ],
"errors" : {
"errors" : [ {
"kind" : "CompilerError",
"location" : [ 1, 1, 1, 19 ],
"message" : "Cannot apply operator `+` on types `str` and `[str]`"
}, {
"kind" : "CompilerError",
"location" : [ 2, 1, 2, 7 ],
"message" : "Cannot apply operator `+` on types `int` and `[int]`"
}, {
"kind" : "CompilerError",
"location" : [ 3, 1, 3, 8 ],
"message" : "Cannot apply operator `+` on types `<Empty>` and `[int]`"
} ],
"kind" : "Errors",
"location" : [ 0, 0, 0, 0 ]
}
}

@ -0,0 +1,18 @@
class A(object):
x:int = 1
z:bool = True
# Duplicate
class A(object):
x:int = 1
# Duplicate
class str(object):
x:int = 1
# Duplicate
class z(object):
x:int = 1
A()

@ -0,0 +1,190 @@
{
"kind" : "Program",
"location" : [ 1, 1, 18, 4 ],
"declarations" : [ {
"kind" : "ClassDef",
"location" : [ 1, 1, 2, 14 ],
"name" : {
"kind" : "Identifier",
"location" : [ 1, 7, 1, 7 ],
"name" : "A"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 1, 9, 1, 14 ],
"name" : "object"
},
"declarations" : [ {
"kind" : "VarDef",
"location" : [ 2, 5, 2, 13 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 2, 5, 2, 9 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 2, 5, 2, 5 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 2, 7, 2, 9 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 2, 13, 2, 13 ],
"value" : 1
}
} ]
}, {
"kind" : "VarDef",
"location" : [ 4, 1, 4, 13 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 4, 1, 4, 6 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 4, 1, 4, 1 ],
"name" : "z"
},
"type" : {
"kind" : "ClassType",
"location" : [ 4, 3, 4, 6 ],
"className" : "bool"
}
},
"value" : {
"kind" : "BooleanLiteral",
"location" : [ 4, 10, 4, 13 ],
"value" : true
}
}, {
"kind" : "ClassDef",
"location" : [ 7, 1, 8, 14 ],
"name" : {
"kind" : "Identifier",
"location" : [ 7, 7, 7, 7 ],
"name" : "A"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 7, 9, 7, 14 ],
"name" : "object"
},
"declarations" : [ {
"kind" : "VarDef",
"location" : [ 8, 5, 8, 13 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 8, 5, 8, 9 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 8, 5, 8, 5 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 8, 7, 8, 9 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 8, 13, 8, 13 ],
"value" : 1
}
} ]
}, {
"kind" : "ClassDef",
"location" : [ 11, 1, 12, 14 ],
"name" : {
"kind" : "Identifier",
"location" : [ 11, 7, 11, 9 ],
"name" : "str"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 11, 11, 11, 16 ],
"name" : "object"
},
"declarations" : [ {
"kind" : "VarDef",
"location" : [ 12, 5, 12, 13 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 12, 5, 12, 9 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 12, 5, 12, 5 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 12, 7, 12, 9 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 12, 13, 12, 13 ],
"value" : 1
}
} ]
}, {
"kind" : "ClassDef",
"location" : [ 15, 1, 16, 14 ],
"name" : {
"kind" : "Identifier",
"location" : [ 15, 7, 15, 7 ],
"name" : "z"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 15, 9, 15, 14 ],
"name" : "object"
},
"declarations" : [ {
"kind" : "VarDef",
"location" : [ 16, 5, 16, 13 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 16, 5, 16, 9 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 16, 5, 16, 5 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 16, 7, 16, 9 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 16, 13, 16, 13 ],
"value" : 1
}
} ]
} ],
"statements" : [ {
"kind" : "ExprStmt",
"location" : [ 18, 1, 18, 3 ],
"expr" : {
"kind" : "CallExpr",
"location" : [ 18, 1, 18, 3 ],
"function" : {
"kind" : "Identifier",
"location" : [ 18, 1, 18, 1 ],
"name" : "A"
},
"args" : [ ]
}
} ],
"errors" : {
"errors" : [ ],
"kind" : "Errors",
"location" : [ 0, 0, 0, 0 ]
}
}

@ -0,0 +1,205 @@
{
"kind" : "Program",
"location" : [ 1, 1, 18, 4 ],
"declarations" : [ {
"kind" : "ClassDef",
"location" : [ 1, 1, 2, 14 ],
"name" : {
"kind" : "Identifier",
"location" : [ 1, 7, 1, 7 ],
"name" : "A"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 1, 9, 1, 14 ],
"name" : "object"
},
"declarations" : [ {
"kind" : "VarDef",
"location" : [ 2, 5, 2, 13 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 2, 5, 2, 9 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 2, 5, 2, 5 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 2, 7, 2, 9 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 2, 13, 2, 13 ],
"value" : 1
}
} ]
}, {
"kind" : "VarDef",
"location" : [ 4, 1, 4, 13 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 4, 1, 4, 6 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 4, 1, 4, 1 ],
"name" : "z"
},
"type" : {
"kind" : "ClassType",
"location" : [ 4, 3, 4, 6 ],
"className" : "bool"
}
},
"value" : {
"kind" : "BooleanLiteral",
"location" : [ 4, 10, 4, 13 ],
"value" : true
}
}, {
"kind" : "ClassDef",
"location" : [ 7, 1, 8, 14 ],
"name" : {
"kind" : "Identifier",
"location" : [ 7, 7, 7, 7 ],
"errorMsg" : "Duplicate declaration of identifier in same scope: A",
"name" : "A"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 7, 9, 7, 14 ],
"name" : "object"
},
"declarations" : [ {
"kind" : "VarDef",
"location" : [ 8, 5, 8, 13 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 8, 5, 8, 9 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 8, 5, 8, 5 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 8, 7, 8, 9 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 8, 13, 8, 13 ],
"value" : 1
}
} ]
}, {
"kind" : "ClassDef",
"location" : [ 11, 1, 12, 14 ],
"name" : {
"kind" : "Identifier",
"location" : [ 11, 7, 11, 9 ],
"errorMsg" : "Duplicate declaration of identifier in same scope: str",
"name" : "str"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 11, 11, 11, 16 ],
"name" : "object"
},
"declarations" : [ {
"kind" : "VarDef",
"location" : [ 12, 5, 12, 13 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 12, 5, 12, 9 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 12, 5, 12, 5 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 12, 7, 12, 9 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 12, 13, 12, 13 ],
"value" : 1
}
} ]
}, {
"kind" : "ClassDef",
"location" : [ 15, 1, 16, 14 ],
"name" : {
"kind" : "Identifier",
"location" : [ 15, 7, 15, 7 ],
"errorMsg" : "Duplicate declaration of identifier in same scope: z",
"name" : "z"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 15, 9, 15, 14 ],
"name" : "object"
},
"declarations" : [ {
"kind" : "VarDef",
"location" : [ 16, 5, 16, 13 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 16, 5, 16, 9 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 16, 5, 16, 5 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 16, 7, 16, 9 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 16, 13, 16, 13 ],
"value" : 1
}
} ]
} ],
"statements" : [ {
"kind" : "ExprStmt",
"location" : [ 18, 1, 18, 3 ],
"expr" : {
"kind" : "CallExpr",
"location" : [ 18, 1, 18, 3 ],
"function" : {
"kind" : "Identifier",
"location" : [ 18, 1, 18, 1 ],
"name" : "A"
},
"args" : [ ]
}
} ],
"errors" : {
"errors" : [ {
"kind" : "CompilerError",
"location" : [ 7, 7, 7, 7 ],
"message" : "Duplicate declaration of identifier in same scope: A"
}, {
"kind" : "CompilerError",
"location" : [ 11, 7, 11, 9 ],
"message" : "Duplicate declaration of identifier in same scope: str"
}, {
"kind" : "CompilerError",
"location" : [ 15, 7, 15, 7 ],
"message" : "Duplicate declaration of identifier in same scope: z"
} ],
"kind" : "Errors",
"location" : [ 0, 0, 0, 0 ]
}
}

@ -0,0 +1,12 @@
class A(object):
x:int = 1 # OK
def foo(self: "A") -> int: # OK
return 0
x:int = 1 # Duplicate
def foo(self: "A") -> int: # Duplicate
return 0
A()

@ -0,0 +1,156 @@
{
"kind" : "Program",
"location" : [ 1, 1, 12, 4 ],
"declarations" : [ {
"kind" : "ClassDef",
"location" : [ 1, 1, 12, 0 ],
"name" : {
"kind" : "Identifier",
"location" : [ 1, 7, 1, 7 ],
"name" : "A"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 1, 9, 1, 14 ],
"name" : "object"
},
"declarations" : [ {
"kind" : "VarDef",
"location" : [ 2, 5, 2, 13 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 2, 5, 2, 9 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 2, 5, 2, 5 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 2, 7, 2, 9 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 2, 13, 2, 13 ],
"value" : 1
}
}, {
"kind" : "FuncDef",
"location" : [ 4, 5, 5, 17 ],
"name" : {
"kind" : "Identifier",
"location" : [ 4, 9, 4, 11 ],
"name" : "foo"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 4, 13, 4, 21 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 4, 13, 4, 16 ],
"name" : "self"
},
"type" : {
"kind" : "ClassType",
"location" : [ 4, 19, 4, 21 ],
"className" : "A"
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 4, 27, 4, 29 ],
"className" : "int"
},
"declarations" : [ ],
"statements" : [ {
"kind" : "ReturnStmt",
"location" : [ 5, 9, 5, 16 ],
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 5, 16, 5, 16 ],
"value" : 0
}
} ]
}, {
"kind" : "VarDef",
"location" : [ 7, 5, 7, 13 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 7, 5, 7, 9 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 7, 5, 7, 5 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 7, 7, 7, 9 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 7, 13, 7, 13 ],
"value" : 1
}
}, {
"kind" : "FuncDef",
"location" : [ 9, 5, 10, 17 ],
"name" : {
"kind" : "Identifier",
"location" : [ 9, 9, 9, 11 ],
"name" : "foo"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 9, 13, 9, 21 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 9, 13, 9, 16 ],
"name" : "self"
},
"type" : {
"kind" : "ClassType",
"location" : [ 9, 19, 9, 21 ],
"className" : "A"
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 9, 27, 9, 29 ],
"className" : "int"
},
"declarations" : [ ],
"statements" : [ {
"kind" : "ReturnStmt",
"location" : [ 10, 9, 10, 16 ],
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 10, 16, 10, 16 ],
"value" : 0
}
} ]
} ]
} ],
"statements" : [ {
"kind" : "ExprStmt",
"location" : [ 12, 1, 12, 3 ],
"expr" : {
"kind" : "CallExpr",
"location" : [ 12, 1, 12, 3 ],
"function" : {
"kind" : "Identifier",
"location" : [ 12, 1, 12, 1 ],
"name" : "A"
},
"args" : [ ]
}
} ],
"errors" : {
"errors" : [ ],
"kind" : "Errors",
"location" : [ 0, 0, 0, 0 ]
}
}

@ -0,0 +1,166 @@
{
"kind" : "Program",
"location" : [ 1, 1, 12, 4 ],
"declarations" : [ {
"kind" : "ClassDef",
"location" : [ 1, 1, 12, 0 ],
"name" : {
"kind" : "Identifier",
"location" : [ 1, 7, 1, 7 ],
"name" : "A"
},
"superClass" : {
"kind" : "Identifier",
"location" : [ 1, 9, 1, 14 ],
"name" : "object"
},
"declarations" : [ {
"kind" : "VarDef",
"location" : [ 2, 5, 2, 13 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 2, 5, 2, 9 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 2, 5, 2, 5 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 2, 7, 2, 9 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 2, 13, 2, 13 ],
"value" : 1
}
}, {
"kind" : "FuncDef",
"location" : [ 4, 5, 5, 17 ],
"name" : {
"kind" : "Identifier",
"location" : [ 4, 9, 4, 11 ],
"name" : "foo"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 4, 13, 4, 21 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 4, 13, 4, 16 ],
"name" : "self"
},
"type" : {
"kind" : "ClassType",
"location" : [ 4, 19, 4, 21 ],
"className" : "A"
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 4, 27, 4, 29 ],
"className" : "int"
},
"declarations" : [ ],
"statements" : [ {
"kind" : "ReturnStmt",
"location" : [ 5, 9, 5, 16 ],
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 5, 16, 5, 16 ],
"value" : 0
}
} ]
}, {
"kind" : "VarDef",
"location" : [ 7, 5, 7, 13 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 7, 5, 7, 9 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 7, 5, 7, 5 ],
"errorMsg" : "Duplicate declaration of identifier in same scope: x",
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 7, 7, 7, 9 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 7, 13, 7, 13 ],
"value" : 1
}
}, {
"kind" : "FuncDef",
"location" : [ 9, 5, 10, 17 ],
"name" : {
"kind" : "Identifier",
"location" : [ 9, 9, 9, 11 ],
"errorMsg" : "Duplicate declaration of identifier in same scope: foo",
"name" : "foo"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 9, 13, 9, 21 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 9, 13, 9, 16 ],
"name" : "self"
},
"type" : {
"kind" : "ClassType",
"location" : [ 9, 19, 9, 21 ],
"className" : "A"
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 9, 27, 9, 29 ],
"className" : "int"
},
"declarations" : [ ],
"statements" : [ {
"kind" : "ReturnStmt",
"location" : [ 10, 9, 10, 16 ],
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 10, 16, 10, 16 ],
"value" : 0
}
} ]
} ]
} ],
"statements" : [ {
"kind" : "ExprStmt",
"location" : [ 12, 1, 12, 3 ],
"expr" : {
"kind" : "CallExpr",
"location" : [ 12, 1, 12, 3 ],
"function" : {
"kind" : "Identifier",
"location" : [ 12, 1, 12, 1 ],
"name" : "A"
},
"args" : [ ]
}
} ],
"errors" : {
"errors" : [ {
"kind" : "CompilerError",
"location" : [ 7, 5, 7, 5 ],
"message" : "Duplicate declaration of identifier in same scope: x"
}, {
"kind" : "CompilerError",
"location" : [ 9, 9, 9, 11 ],
"message" : "Duplicate declaration of identifier in same scope: foo"
} ],
"kind" : "Errors",
"location" : [ 0, 0, 0, 0 ]
}
}

@ -0,0 +1,18 @@
x:int = 1
def foo() -> object:
pass
# `foo` cannot be redefined in the same scope
def foo() -> object:
pass
# `print` cannot be redefined in the same scope
def print(val:object) -> object:
pass
# `x` cannot be redefined in the same scope
x:int = 2
foo()

@ -0,0 +1,129 @@
{
"kind" : "Program",
"location" : [ 1, 1, 18, 6 ],
"declarations" : [ {
"kind" : "VarDef",
"location" : [ 1, 1, 1, 9 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 1, 1, 1, 5 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 1, 1, 1, 1 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 1, 3, 1, 5 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 1, 9, 1, 9 ],
"value" : 1
}
}, {
"kind" : "FuncDef",
"location" : [ 3, 1, 4, 9 ],
"name" : {
"kind" : "Identifier",
"location" : [ 3, 5, 3, 7 ],
"name" : "foo"
},
"params" : [ ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 3, 14, 3, 19 ],
"className" : "object"
},
"declarations" : [ ],
"statements" : [ ]
}, {
"kind" : "FuncDef",
"location" : [ 7, 1, 8, 9 ],
"name" : {
"kind" : "Identifier",
"location" : [ 7, 5, 7, 7 ],
"name" : "foo"
},
"params" : [ ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 7, 14, 7, 19 ],
"className" : "object"
},
"declarations" : [ ],
"statements" : [ ]
}, {
"kind" : "FuncDef",
"location" : [ 11, 1, 12, 9 ],
"name" : {
"kind" : "Identifier",
"location" : [ 11, 5, 11, 9 ],
"name" : "print"
},
"params" : [ {
"kind" : "TypedVar",
"location" : [ 11, 11, 11, 20 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 11, 11, 11, 13 ],
"name" : "val"
},
"type" : {
"kind" : "ClassType",
"location" : [ 11, 15, 11, 20 ],
"className" : "object"
}
} ],
"returnType" : {
"kind" : "ClassType",
"location" : [ 11, 26, 11, 31 ],
"className" : "object"
},
"declarations" : [ ],
"statements" : [ ]
}, {
"kind" : "VarDef",
"location" : [ 15, 1, 15, 9 ],
"var" : {
"kind" : "TypedVar",
"location" : [ 15, 1, 15, 5 ],
"identifier" : {
"kind" : "Identifier",
"location" : [ 15, 1, 15, 1 ],
"name" : "x"
},
"type" : {
"kind" : "ClassType",
"location" : [ 15, 3, 15, 5 ],
"className" : "int"
}
},
"value" : {
"kind" : "IntegerLiteral",
"location" : [ 15, 9, 15, 9 ],
"value" : 2
}
} ],
"statements" : [ {
"kind" : "ExprStmt",
"location" : [ 18, 1, 18, 5 ],
"expr" : {
"kind" : "CallExpr",
"location" : [ 18, 1, 18, 5 ],
"function" : {
"kind" : "Identifier",
"location" : [ 18, 1, 18, 3 ],
"name" : "foo"
},
"args" : [ ]
}
} ],
"errors" : {
"errors" : [ ],
"kind" : "Errors",
"location" : [ 0, 0, 0, 0 ]
}
}

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save