commit
b758a071dc
@ -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…
Reference in new issue