Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(69)

Side by Side Diff: compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerCompilerTest.java

Issue 10825135: Issue 4238. Infer Element subclass from query() parameter (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 package com.google.dart.compiler.type; 4 package com.google.dart.compiler.type;
5 5
6 import com.google.common.base.Joiner; 6 import com.google.common.base.Joiner;
7 import com.google.common.collect.Iterables; 7 import com.google.common.collect.Iterables;
8 import com.google.common.collect.Lists; 8 import com.google.common.collect.Lists;
9 import com.google.common.collect.Maps; 9 import com.google.common.collect.Maps;
10 import com.google.dart.compiler.CommandLineOptions.CompilerOptions; 10 import com.google.dart.compiler.CommandLineOptions.CompilerOptions;
(...skipping 1785 matching lines...) Expand 10 before | Expand all | Expand 10 after
1796 " var v = a;", 1796 " var v = a;",
1797 " v.f = 0;", 1797 " v.f = 0;",
1798 " v.m();", 1798 " v.m();",
1799 "}", 1799 "}",
1800 ""); 1800 "");
1801 assertErrors(result.getErrors()); 1801 assertErrors(result.getErrors());
1802 } 1802 }
1803 } 1803 }
1804 1804
1805 public void test_typesPropagation_assignAtDeclaration() throws Exception { 1805 public void test_typesPropagation_assignAtDeclaration() throws Exception {
1806 AnalyzeLibraryResult libraryResult = analyzeLibrary( 1806 analyzeLibrary(
1807 "f() {", 1807 "f() {",
1808 " var v0 = true;", 1808 " var v0 = true;",
1809 " var v1 = true && false;", 1809 " var v1 = true && false;",
1810 " var v2 = 1;", 1810 " var v2 = 1;",
1811 " var v3 = 1 + 2;", 1811 " var v3 = 1 + 2;",
1812 " var v4 = 1.0;", 1812 " var v4 = 1.0;",
1813 " var v5 = 1.0 + 2.0;", 1813 " var v5 = 1.0 + 2.0;",
1814 " var v6 = new Map<String, int>();", 1814 " var v6 = new Map<String, int>();",
1815 " var v7 = new Map().length;", 1815 " var v7 = new Map().length;",
1816 " var v8 = Math.random();", 1816 " var v8 = Math.random();",
1817 "}", 1817 "}",
1818 ""); 1818 "");
1819 // prepare expected results 1819 // prepare expected results
1820 List<String> expectedList = Lists.newArrayList(); 1820 List<String> expectedList = Lists.newArrayList();
1821 expectedList.add("bool"); 1821 expectedList.add("bool");
1822 expectedList.add("bool"); 1822 expectedList.add("bool");
1823 expectedList.add("int"); 1823 expectedList.add("int");
1824 expectedList.add("int"); 1824 expectedList.add("int");
1825 expectedList.add("double"); 1825 expectedList.add("double");
1826 expectedList.add("double"); 1826 expectedList.add("double");
1827 expectedList.add("Map<String, int>"); 1827 expectedList.add("Map<String, int>");
1828 expectedList.add("int"); 1828 expectedList.add("int");
1829 expectedList.add("double"); 1829 expectedList.add("double");
1830 // check each "v" type 1830 // check each "v" type
1831 for (int i = 0; i < expectedList.size(); i++) { 1831 for (int i = 0; i < expectedList.size(); i++) {
1832 String expectedTypeString = expectedList.get(i); 1832 String expectedTypeString = expectedList.get(i);
1833 assertInferredElementTypeString(libraryResult, "v" + i, expectedTypeString ); 1833 assertInferredElementTypeString(testUnit, "v" + i, expectedTypeString);
1834 } 1834 }
1835 } 1835 }
1836 1836
1837 public void test_typesPropagation_secondAssign_sameType() throws Exception { 1837 public void test_typesPropagation_secondAssign_sameType() throws Exception {
1838 AnalyzeLibraryResult libraryResult = analyzeLibrary( 1838 analyzeLibrary(
1839 "// filler filler filler filler filler filler filler filler filler fille r",
1839 "f() {", 1840 "f() {",
1840 " var v = true;", 1841 " var v = true;",
1841 " v = false;", 1842 " v = false;",
1842 "}", 1843 "}",
1843 ""); 1844 "");
1844 assertInferredElementTypeString(libraryResult, "v", "bool"); 1845 assertInferredElementTypeString(testUnit, "v", "bool");
1845 } 1846 }
1846 1847
1847 public void test_typesPropagation_secondAssign_differentType() throws Exceptio n { 1848 public void test_typesPropagation_secondAssign_differentType() throws Exceptio n {
1848 AnalyzeLibraryResult libraryResult = analyzeLibrary( 1849 analyzeLibrary(
1850 "// filler filler filler filler filler filler filler filler filler fille r",
1849 "f() {", 1851 "f() {",
1850 " var v = true;", 1852 " var v = true;",
1851 " v = 0;", 1853 " v = 0;",
1852 "}", 1854 "}",
1853 ""); 1855 "");
1854 assertInferredElementTypeString(libraryResult, "v", "<dynamic>"); 1856 assertInferredElementTypeString(testUnit, "v", "<dynamic>");
1855 } 1857 }
1856 1858
1857 /** 1859 /**
1858 * When we can not identify type of assigned value we should keep "Dynamic" as type of variable. 1860 * When we can not identify type of assigned value we should keep "Dynamic" as type of variable.
1859 */ 1861 */
1860 public void test_typesPropagation_assign_newUnknownType() throws Exception { 1862 public void test_typesPropagation_assign_newUnknownType() throws Exception {
1861 AnalyzeLibraryResult libraryResult = analyzeLibrary( 1863 analyzeLibrary(
1862 "// filler filler filler filler filler filler filler filler filler fille r", 1864 "// filler filler filler filler filler filler filler filler filler fille r",
1863 "f() {", 1865 "f() {",
1864 " var v1 = new Unknown();", 1866 " var v1 = new Unknown();",
1865 " var v2 = new Unknown.name();", 1867 " var v2 = new Unknown.name();",
1866 "}", 1868 "}",
1867 ""); 1869 "");
1868 assertInferredElementTypeString(libraryResult, "v1", "<dynamic>"); 1870 assertInferredElementTypeString(testUnit, "v1", "<dynamic>");
1869 assertInferredElementTypeString(libraryResult, "v2", "<dynamic>"); 1871 assertInferredElementTypeString(testUnit, "v2", "<dynamic>");
1870 } 1872 }
1871 1873
1872 public void test_typesPropagation_ifAsType() throws Exception { 1874 public void test_typesPropagation_ifAsType() throws Exception {
1873 AnalyzeLibraryResult libraryResult = analyzeLibrary( 1875 analyzeLibrary(
1876 "// filler filler filler filler filler filler filler filler filler fille r",
1874 "f(var v) {", 1877 "f(var v) {",
1875 " if ((v as String).length != 0) {", 1878 " if ((v as String).length != 0) {",
1876 " var v1 = v;", 1879 " var v1 = v;",
1877 " }", 1880 " }",
1878 " var v2 = v;", 1881 " var v2 = v;",
1879 "}", 1882 "}",
1880 ""); 1883 "");
1881 assertInferredElementTypeString(libraryResult, "v1", "String"); 1884 assertInferredElementTypeString(testUnit, "v1", "String");
1882 assertInferredElementTypeString(libraryResult, "v2", "<dynamic>"); 1885 assertInferredElementTypeString(testUnit, "v2", "<dynamic>");
1883 } 1886 }
1884 1887
1885 /** 1888 /**
1886 * Even if there is negation, we still apply "as" cast, so visit "then" statem ent only if cast was 1889 * Even if there is negation, we still apply "as" cast, so visit "then" statem ent only if cast was
1887 * successful. 1890 * successful.
1888 */ 1891 */
1889 public void test_typesPropagation_ifAsType_negation() throws Exception { 1892 public void test_typesPropagation_ifAsType_negation() throws Exception {
1890 AnalyzeLibraryResult libraryResult = analyzeLibrary( 1893 analyzeLibrary(
1894 "// filler filler filler filler filler filler filler filler filler fille r",
1891 "f(var v) {", 1895 "f(var v) {",
1892 " if (!(v as String).isEmpty()) {", 1896 " if (!(v as String).isEmpty()) {",
1893 " var v1 = v;", 1897 " var v1 = v;",
1894 " }", 1898 " }",
1895 " var v2 = v;", 1899 " var v2 = v;",
1896 "}", 1900 "}",
1897 ""); 1901 "");
1898 assertInferredElementTypeString(libraryResult, "v1", "String"); 1902 assertInferredElementTypeString(testUnit, "v1", "String");
1899 assertInferredElementTypeString(libraryResult, "v2", "<dynamic>"); 1903 assertInferredElementTypeString(testUnit, "v2", "<dynamic>");
1900 } 1904 }
1901 1905
1902 public void test_typesPropagation_ifIsType() throws Exception { 1906 public void test_typesPropagation_ifIsType() throws Exception {
1903 AnalyzeLibraryResult libraryResult = analyzeLibrary( 1907 analyzeLibrary(
1904 "f(var v) {", 1908 "f(var v) {",
1905 " if (v is List<String>) {", 1909 " if (v is List<String>) {",
1906 " var v1 = v;", 1910 " var v1 = v;",
1907 " }", 1911 " }",
1908 " if (v is Map<int, String>) {", 1912 " if (v is Map<int, String>) {",
1909 " var v2 = v;", 1913 " var v2 = v;",
1910 " }", 1914 " }",
1911 " var v3 = v;", 1915 " var v3 = v;",
1912 "}", 1916 "}",
1913 ""); 1917 "");
1914 assertInferredElementTypeString(libraryResult, "v1", "List<String>"); 1918 assertInferredElementTypeString(testUnit, "v1", "List<String>");
1915 assertInferredElementTypeString(libraryResult, "v2", "Map<int, String>"); 1919 assertInferredElementTypeString(testUnit, "v2", "Map<int, String>");
1916 assertInferredElementTypeString(libraryResult, "v3", "<dynamic>"); 1920 assertInferredElementTypeString(testUnit, "v3", "<dynamic>");
1917 } 1921 }
1918 1922
1919 /** 1923 /**
1920 * We should not make variable type less specific, even if there is such (usel ess) user code. 1924 * We should not make variable type less specific, even if there is such (usel ess) user code.
1921 */ 1925 */
1922 public void test_typesPropagation_ifIsType_mostSpecific() throws Exception { 1926 public void test_typesPropagation_ifIsType_mostSpecific() throws Exception {
1923 AnalyzeLibraryResult libraryResult = analyzeLibrary( 1927 analyzeLibrary(
1924 "f() {", 1928 "f() {",
1925 " int a;", 1929 " int a;",
1926 " num b;", 1930 " num b;",
1927 " if (a is num) {", 1931 " if (a is num) {",
1928 " var a1 = a;", 1932 " var a1 = a;",
1929 " }", 1933 " }",
1930 " if (a is Dynamic) {", 1934 " if (a is Dynamic) {",
1931 " var a2 = a;", 1935 " var a2 = a;",
1932 " }", 1936 " }",
1933 " if (b is int) {", 1937 " if (b is int) {",
1934 " var b1 = b;", 1938 " var b1 = b;",
1935 " }", 1939 " }",
1936 "}", 1940 "}",
1937 ""); 1941 "");
1938 assertInferredElementTypeString(libraryResult, "a1", "int"); 1942 assertInferredElementTypeString(testUnit, "a1", "int");
1939 assertInferredElementTypeString(libraryResult, "a2", "int"); 1943 assertInferredElementTypeString(testUnit, "a2", "int");
1940 assertInferredElementTypeString(libraryResult, "b1", "int"); 1944 assertInferredElementTypeString(testUnit, "b1", "int");
1941 } 1945 }
1942 1946
1943 /** 1947 /**
1944 * When single variable has conflicting type constraints, right now we don't t ry to unify them, 1948 * When single variable has conflicting type constraints, right now we don't t ry to unify them,
1945 * instead we fall back to "Dynamic". 1949 * instead we fall back to "Dynamic".
1946 */ 1950 */
1947 public void test_typesPropagation_ifIsType_conflictingTypes() throws Exception { 1951 public void test_typesPropagation_ifIsType_conflictingTypes() throws Exception {
1948 AnalyzeLibraryResult libraryResult = analyzeLibrary( 1952 analyzeLibrary(
1953 "// filler filler filler filler filler filler filler filler filler fille r",
1949 "f(int v) {", 1954 "f(int v) {",
1950 " if (v is String) {", 1955 " if (v is String) {",
1951 " var v1 = v;", 1956 " var v1 = v;",
1952 " }", 1957 " }",
1953 "}", 1958 "}",
1954 ""); 1959 "");
1955 assertInferredElementTypeString(libraryResult, "v1", "<dynamic>"); 1960 assertInferredElementTypeString(testUnit, "v1", "<dynamic>");
1956 } 1961 }
1957 1962
1958 public void test_typesPropagation_ifIsType_negation() throws Exception { 1963 public void test_typesPropagation_ifIsType_negation() throws Exception {
1959 AnalyzeLibraryResult libraryResult = analyzeLibrary( 1964 analyzeLibrary(
1960 "f(var v) {", 1965 "f(var v) {",
1961 " if (v is! String) {", 1966 " if (v is! String) {",
1962 " var v1 = v;", 1967 " var v1 = v;",
1963 " }", 1968 " }",
1964 " if (!(v is String)) {", 1969 " if (!(v is String)) {",
1965 " var v2 = v;", 1970 " var v2 = v;",
1966 " }", 1971 " }",
1967 " if (!!(v is String)) {", 1972 " if (!!(v is String)) {",
1968 " var v3 = v;", 1973 " var v3 = v;",
1969 " }", 1974 " }",
1970 "}", 1975 "}",
1971 ""); 1976 "");
1972 assertInferredElementTypeString(libraryResult, "v1", "<dynamic>"); 1977 assertInferredElementTypeString(testUnit, "v1", "<dynamic>");
1973 assertInferredElementTypeString(libraryResult, "v2", "<dynamic>"); 1978 assertInferredElementTypeString(testUnit, "v2", "<dynamic>");
1974 assertInferredElementTypeString(libraryResult, "v3", "String"); 1979 assertInferredElementTypeString(testUnit, "v3", "String");
1975 } 1980 }
1976 1981
1977 public void test_typesPropagation_ifIsType_and() throws Exception { 1982 public void test_typesPropagation_ifIsType_and() throws Exception {
1978 AnalyzeLibraryResult libraryResult = analyzeLibrary( 1983 analyzeLibrary(
1984 "// filler filler filler filler filler filler filler filler filler fille r",
1979 "f(var a, var b) {", 1985 "f(var a, var b) {",
1980 " if (a is String && b is List<String>) {", 1986 " if (a is String && b is List<String>) {",
1981 " var a1 = a;", 1987 " var a1 = a;",
1982 " var b1 = b;", 1988 " var b1 = b;",
1983 " }", 1989 " }",
1984 "}", 1990 "}",
1985 ""); 1991 "");
1986 assertInferredElementTypeString(libraryResult, "a1", "String"); 1992 assertInferredElementTypeString(testUnit, "a1", "String");
1987 assertInferredElementTypeString(libraryResult, "b1", "List<String>"); 1993 assertInferredElementTypeString(testUnit, "b1", "List<String>");
1988 } 1994 }
1989 1995
1990 public void test_typesPropagation_ifIsType_or() throws Exception { 1996 public void test_typesPropagation_ifIsType_or() throws Exception {
1991 AnalyzeLibraryResult libraryResult = analyzeLibrary( 1997 analyzeLibrary(
1998 "// filler filler filler filler filler filler filler filler filler fille r",
1992 "f(var v) {", 1999 "f(var v) {",
1993 " if (true || v is String) {", 2000 " if (true || v is String) {",
1994 " var v1 = v;", 2001 " var v1 = v;",
1995 " }", 2002 " }",
1996 " if (v is String || true) {", 2003 " if (v is String || true) {",
1997 " var v2 = v;", 2004 " var v2 = v;",
1998 " }", 2005 " }",
1999 "}", 2006 "}",
2000 ""); 2007 "");
2001 assertInferredElementTypeString(libraryResult, "v1", "<dynamic>"); 2008 assertInferredElementTypeString(testUnit, "v1", "<dynamic>");
2002 assertInferredElementTypeString(libraryResult, "v2", "<dynamic>"); 2009 assertInferredElementTypeString(testUnit, "v2", "<dynamic>");
2003 } 2010 }
2004 2011
2005 public void test_typesPropagation_whileIsType() throws Exception { 2012 public void test_typesPropagation_whileIsType() throws Exception {
2006 AnalyzeLibraryResult libraryResult = analyzeLibrary( 2013 analyzeLibrary(
2014 "// filler filler filler filler filler filler filler filler filler fille r",
2007 "f(var v) {", 2015 "f(var v) {",
2008 " var v = null;", 2016 " var v = null;",
2009 " while (v is String) {", 2017 " while (v is String) {",
2010 " var v1 = v;", 2018 " var v1 = v;",
2011 " }", 2019 " }",
2012 " var v2 = v;", 2020 " var v2 = v;",
2013 "}", 2021 "}",
2014 ""); 2022 "");
2015 assertInferredElementTypeString(libraryResult, "v1", "String"); 2023 assertInferredElementTypeString(testUnit, "v1", "String");
2016 assertInferredElementTypeString(libraryResult, "v2", "<dynamic>"); 2024 assertInferredElementTypeString(testUnit, "v2", "<dynamic>");
2017 } 2025 }
2018 2026
2019 public void test_typesPropagation_forIsType() throws Exception { 2027 public void test_typesPropagation_forIsType() throws Exception {
2020 AnalyzeLibraryResult libraryResult = analyzeLibrary( 2028 analyzeLibrary(
2029 "// filler filler filler filler filler filler filler filler filler fille r",
2021 "f(var v) {", 2030 "f(var v) {",
2022 " var v = null;", 2031 " var v = null;",
2023 " for (; v is String; () {var v2 = v;} ()) {", 2032 " for (; v is String; () {var v2 = v;} ()) {",
2024 " var v1 = v;", 2033 " var v1 = v;",
2025 " }", 2034 " }",
2026 " var v3 = v;", 2035 " var v3 = v;",
2027 "}", 2036 "}",
2028 ""); 2037 "");
2029 assertInferredElementTypeString(libraryResult, "v1", "String"); 2038 assertInferredElementTypeString(testUnit, "v1", "String");
2030 assertInferredElementTypeString(libraryResult, "v2", "String"); 2039 assertInferredElementTypeString(testUnit, "v2", "String");
2031 assertInferredElementTypeString(libraryResult, "v3", "<dynamic>"); 2040 assertInferredElementTypeString(testUnit, "v3", "<dynamic>");
2032 } 2041 }
2033 2042
2034 public void test_typesPropagation_forEach() throws Exception { 2043 public void test_typesPropagation_forEach() throws Exception {
2035 AnalyzeLibraryResult libraryResult = analyzeLibrary( 2044 analyzeLibrary(
2045 "// filler filler filler filler filler filler filler filler filler fille r",
2036 "f(var v) {", 2046 "f(var v) {",
2037 " List<String> values = [];", 2047 " List<String> values = [];",
2038 " for (var v in values) {", 2048 " for (var v in values) {",
2039 " var v1 = v;", 2049 " var v1 = v;",
2040 " }", 2050 " }",
2041 "}", 2051 "}",
2042 ""); 2052 "");
2043 assertInferredElementTypeString(libraryResult, "v1", "String"); 2053 assertInferredElementTypeString(testUnit, "v1", "String");
2044 } 2054 }
2045 2055
2046 public void test_typesPropagation_ifIsNotType_withElse() throws Exception { 2056 public void test_typesPropagation_ifIsNotType_withElse() throws Exception {
2047 AnalyzeLibraryResult libraryResult = analyzeLibrary( 2057 analyzeLibrary(
2058 "// filler filler filler filler filler filler filler filler filler fille r",
2048 "f(var v) {", 2059 "f(var v) {",
2049 " if (v is! String) {", 2060 " if (v is! String) {",
2050 " var v1 = v;", 2061 " var v1 = v;",
2051 " } else {", 2062 " } else {",
2052 " var v2 = v;", 2063 " var v2 = v;",
2053 " }", 2064 " }",
2054 " var v3 = v;", 2065 " var v3 = v;",
2055 "}", 2066 "}",
2056 ""); 2067 "");
2057 // we don't know type, but not String 2068 // we don't know type, but not String
2058 assertInferredElementTypeString(libraryResult, "v1", "<dynamic>"); 2069 assertInferredElementTypeString(testUnit, "v1", "<dynamic>");
2059 // we know that String 2070 // we know that String
2060 assertInferredElementTypeString(libraryResult, "v2", "String"); 2071 assertInferredElementTypeString(testUnit, "v2", "String");
2061 // again, we don't know after "if" 2072 // again, we don't know after "if"
2062 assertInferredElementTypeString(libraryResult, "v3", "<dynamic>"); 2073 assertInferredElementTypeString(testUnit, "v3", "<dynamic>");
2063 } 2074 }
2064 2075
2065 public void test_typesPropagation_ifIsNotType_hasThenReturn() throws Exception { 2076 public void test_typesPropagation_ifIsNotType_hasThenReturn() throws Exception {
2066 AnalyzeLibraryResult libraryResult = analyzeLibrary( 2077 analyzeLibrary(
2078 "// filler filler filler filler filler filler filler filler filler fille r",
2067 "f(var v) {", 2079 "f(var v) {",
2068 " var v1 = v;", 2080 " var v1 = v;",
2069 " if (v is! String) {", 2081 " if (v is! String) {",
2070 " return;", 2082 " return;",
2071 " }", 2083 " }",
2072 " var v2 = v;", 2084 " var v2 = v;",
2073 "}", 2085 "}",
2074 ""); 2086 "");
2075 assertInferredElementTypeString(libraryResult, "v1", "<dynamic>"); 2087 assertInferredElementTypeString(testUnit, "v1", "<dynamic>");
2076 assertInferredElementTypeString(libraryResult, "v2", "String"); 2088 assertInferredElementTypeString(testUnit, "v2", "String");
2077 } 2089 }
2078 2090
2079 public void test_typesPropagation_ifIsNotType_hasThenThrow() throws Exception { 2091 public void test_typesPropagation_ifIsNotType_hasThenThrow() throws Exception {
2080 AnalyzeLibraryResult libraryResult = analyzeLibrary( 2092 analyzeLibrary(
2093 "// filler filler filler filler filler filler filler filler filler fille r",
2081 "f(var v) {", 2094 "f(var v) {",
2082 " if (v is! String) {", 2095 " if (v is! String) {",
2083 " throw new Exception();", 2096 " throw new Exception();",
2084 " }", 2097 " }",
2085 " var v1 = v;", 2098 " var v1 = v;",
2086 "}", 2099 "}",
2087 ""); 2100 "");
2088 assertInferredElementTypeString(libraryResult, "v1", "String"); 2101 assertInferredElementTypeString(testUnit, "v1", "String");
2089 } 2102 }
2090 2103
2091 public void test_typesPropagation_ifIsNotType_emptyThen() throws Exception { 2104 public void test_typesPropagation_ifIsNotType_emptyThen() throws Exception {
2092 AnalyzeLibraryResult libraryResult = analyzeLibrary( 2105 analyzeLibrary(
2106 "// filler filler filler filler filler filler filler filler filler fille r",
2093 "f(var v) {", 2107 "f(var v) {",
2094 " if (v is! String) {", 2108 " if (v is! String) {",
2095 " }", 2109 " }",
2096 " var v1 = v;", 2110 " var v1 = v;",
2097 "}", 2111 "}",
2098 ""); 2112 "");
2099 assertInferredElementTypeString(libraryResult, "v1", "<dynamic>"); 2113 assertInferredElementTypeString(testUnit, "v1", "<dynamic>");
2100 } 2114 }
2101 2115
2102 public void test_typesPropagation_ifIsNotType_otherThen() throws Exception { 2116 public void test_typesPropagation_ifIsNotType_otherThen() throws Exception {
2103 AnalyzeLibraryResult libraryResult = analyzeLibrary( 2117 analyzeLibrary(
2118 "// filler filler filler filler filler filler filler filler filler fille r",
2104 "f(var v) {", 2119 "f(var v) {",
2105 " if (v is! String) {", 2120 " if (v is! String) {",
2106 " ;", 2121 " ;",
2107 " }", 2122 " }",
2108 " var v1 = v;", 2123 " var v1 = v;",
2109 "}", 2124 "}",
2110 ""); 2125 "");
2111 assertInferredElementTypeString(libraryResult, "v1", "<dynamic>"); 2126 assertInferredElementTypeString(testUnit, "v1", "<dynamic>");
2112 } 2127 }
2113 2128
2114 public void test_typesPropagation_ifIsNotType_hasThenThrow_withCatch() throws Exception { 2129 public void test_typesPropagation_ifIsNotType_hasThenThrow_withCatch() throws Exception {
2115 AnalyzeLibraryResult libraryResult = analyzeLibrary( 2130 analyzeLibrary(
2131 "// filler filler filler filler filler filler filler filler filler fille r",
2116 "f(var v) {", 2132 "f(var v) {",
2117 " try {", 2133 " try {",
2118 " if (v is! String) {", 2134 " if (v is! String) {",
2119 " throw new Exception();", 2135 " throw new Exception();",
2120 " }", 2136 " }",
2121 " } catch (var e) {", 2137 " } catch (var e) {",
2122 " }", 2138 " }",
2123 " var v1 = v;", 2139 " var v1 = v;",
2124 "}", 2140 "}",
2125 ""); 2141 "");
2126 assertInferredElementTypeString(libraryResult, "v1", "<dynamic>"); 2142 assertInferredElementTypeString(testUnit, "v1", "<dynamic>");
2127 } 2143 }
2128 2144
2129 public void test_typesPropagation_ifIsNotType_or() throws Exception { 2145 public void test_typesPropagation_ifIsNotType_or() throws Exception {
2130 AnalyzeLibraryResult libraryResult = analyzeLibrary( 2146 analyzeLibrary(
2147 "// filler filler filler filler filler filler filler filler filler fille r",
2131 "f(var p1, var p2) {", 2148 "f(var p1, var p2) {",
2132 " if (p1 is! int || p2 is! String) {", 2149 " if (p1 is! int || p2 is! String) {",
2133 " return;", 2150 " return;",
2134 " }", 2151 " }",
2135 " var v1 = p1;", 2152 " var v1 = p1;",
2136 " var v2 = p2;", 2153 " var v2 = p2;",
2137 "}", 2154 "}",
2138 ""); 2155 "");
2139 assertInferredElementTypeString(libraryResult, "v1", "int"); 2156 assertInferredElementTypeString(testUnit, "v1", "int");
2140 assertInferredElementTypeString(libraryResult, "v2", "String"); 2157 assertInferredElementTypeString(testUnit, "v2", "String");
2141 } 2158 }
2142 2159
2143 public void test_typesPropagation_ifIsNotType_and() throws Exception { 2160 public void test_typesPropagation_ifIsNotType_and() throws Exception {
2144 AnalyzeLibraryResult libraryResult = analyzeLibrary( 2161 analyzeLibrary(
2162 "// filler filler filler filler filler filler filler filler filler fille r",
2145 "f(var v) {", 2163 "f(var v) {",
2146 " if (v is! String && true) {", 2164 " if (v is! String && true) {",
2147 " return;", 2165 " return;",
2148 " }", 2166 " }",
2149 " var v1 = v;", 2167 " var v1 = v;",
2150 "}", 2168 "}",
2151 ""); 2169 "");
2152 assertInferredElementTypeString(libraryResult, "v1", "<dynamic>"); 2170 assertInferredElementTypeString(testUnit, "v1", "<dynamic>");
2153 } 2171 }
2154 2172
2155 public void test_typesPropagation_ifIsNotType_not() throws Exception { 2173 public void test_typesPropagation_ifIsNotType_not() throws Exception {
2156 AnalyzeLibraryResult libraryResult = analyzeLibrary( 2174 analyzeLibrary(
2175 "// filler filler filler filler filler filler filler filler filler fille r",
2157 "f(var v) {", 2176 "f(var v) {",
2158 " if (!(v is! String)) {", 2177 " if (!(v is! String)) {",
2159 " return;", 2178 " return;",
2160 " }", 2179 " }",
2161 " var v1 = v;", 2180 " var v1 = v;",
2162 "}", 2181 "}",
2163 ""); 2182 "");
2164 assertInferredElementTypeString(libraryResult, "v1", "<dynamic>"); 2183 assertInferredElementTypeString(testUnit, "v1", "<dynamic>");
2165 } 2184 }
2166 2185
2167 public void test_typesPropagation_ifIsNotType_not2() throws Exception { 2186 public void test_typesPropagation_ifIsNotType_not2() throws Exception {
2168 AnalyzeLibraryResult libraryResult = analyzeLibrary( 2187 analyzeLibrary(
2188 "// filler filler filler filler filler filler filler filler filler fille r",
2169 "f(var v) {", 2189 "f(var v) {",
2170 " if (!!(v is! String)) {", 2190 " if (!!(v is! String)) {",
2171 " return;", 2191 " return;",
2172 " }", 2192 " }",
2173 " var v1 = v;", 2193 " var v1 = v;",
2174 "}", 2194 "}",
2175 ""); 2195 "");
2176 assertInferredElementTypeString(libraryResult, "v1", "String"); 2196 assertInferredElementTypeString(testUnit, "v1", "String");
2177 } 2197 }
2178 2198
2179 public void test_typesPropagation_ifNotIsType() throws Exception { 2199 public void test_typesPropagation_ifNotIsType() throws Exception {
2180 AnalyzeLibraryResult libraryResult = analyzeLibrary( 2200 analyzeLibrary(
2201 "// filler filler filler filler filler filler filler filler filler fille r",
2181 "f(var v) {", 2202 "f(var v) {",
2182 " if (!(v is String)) {", 2203 " if (!(v is String)) {",
2183 " return;", 2204 " return;",
2184 " }", 2205 " }",
2185 " var v1 = v;", 2206 " var v1 = v;",
2186 "}", 2207 "}",
2187 ""); 2208 "");
2188 assertInferredElementTypeString(libraryResult, "v1", "String"); 2209 assertInferredElementTypeString(testUnit, "v1", "String");
2189 } 2210 }
2190 2211
2191 public void test_typesPropagation_field_inClass() throws Exception { 2212 public void test_typesPropagation_field_inClass() throws Exception {
2192 AnalyzeLibraryResult libraryResult = analyzeLibrary( 2213 analyzeLibrary(
2193 "// filler filler filler filler filler filler filler filler filler fille r", 2214 "// filler filler filler filler filler filler filler filler filler fille r",
2194 "class A {", 2215 "class A {",
2195 " var v1 = 123;", 2216 " var v1 = 123;",
2196 " var v2 = Math.random();", 2217 " var v2 = Math.random();",
2197 " var v3 = 1 + 2.0;", 2218 " var v3 = 1 + 2.0;",
2198 "}", 2219 "}",
2199 ""); 2220 "");
2200 assertInferredElementTypeString(libraryResult, "v1", "int"); 2221 assertInferredElementTypeString(testUnit, "v1", "int");
2201 assertInferredElementTypeString(libraryResult, "v2", "double"); 2222 assertInferredElementTypeString(testUnit, "v2", "double");
2202 assertInferredElementTypeString(libraryResult, "v3", "double"); 2223 assertInferredElementTypeString(testUnit, "v3", "double");
2203 } 2224 }
2204 2225
2205 public void test_typesPropagation_field_topLevel() throws Exception { 2226 public void test_typesPropagation_field_topLevel() throws Exception {
2206 AnalyzeLibraryResult libraryResult = analyzeLibrary( 2227 analyzeLibrary(
2207 "// filler filler filler filler filler filler filler filler filler fille r", 2228 "// filler filler filler filler filler filler filler filler filler fille r",
2208 "var v1 = 123;", 2229 "var v1 = 123;",
2209 "var v2 = Math.random();", 2230 "var v2 = Math.random();",
2210 "var v3 = 1 + 2.0;", 2231 "var v3 = 1 + 2.0;",
2211 ""); 2232 "");
2212 assertInferredElementTypeString(libraryResult, "v1", "int"); 2233 assertInferredElementTypeString(testUnit, "v1", "int");
2213 assertInferredElementTypeString(libraryResult, "v2", "double"); 2234 assertInferredElementTypeString(testUnit, "v2", "double");
2214 assertInferredElementTypeString(libraryResult, "v3", "double"); 2235 assertInferredElementTypeString(testUnit, "v3", "double");
2215 } 2236 }
2216 2237
2217 public void test_typesPropagation_FunctionAliasType() throws Exception { 2238 public void test_typesPropagation_FunctionAliasType() throws Exception {
2218 AnalyzeLibraryResult libraryResult = analyzeLibrary( 2239 analyzeLibrary(
2219 "// filler filler filler filler filler filler filler filler filler fille r", 2240 "// filler filler filler filler filler filler filler filler filler fille r",
2220 "typedef F();", 2241 "typedef F();",
2221 "foo(F f) {", 2242 "foo(F f) {",
2222 " var v = f;", 2243 " var v = f;",
2223 " v();", 2244 " v();",
2224 "}", 2245 "}",
2225 "", 2246 "",
2226 ""); 2247 "");
2227 assertInferredElementTypeString(libraryResult, "v", "F"); 2248 assertInferredElementTypeString(testUnit, "v", "F");
2228 } 2249 }
2229 2250
2230 /** 2251 /**
2231 * When we pass "function literal" into invocation on some method, we may know exact 2252 * When we pass "function literal" into invocation on some method, we may know exact
2232 * <code>Function</code> type expected by this method, so we know types of "fu nction literal" 2253 * <code>Function</code> type expected by this method, so we know types of "fu nction literal"
2233 * parameters. So, if these types are not specified in "function literal", we can use "expected" 2254 * parameters. So, if these types are not specified in "function literal", we can use "expected"
2234 * types. 2255 * types.
2235 * <p> 2256 * <p>
2236 * http://code.google.com/p/dart/issues/detail?id=3712 2257 * http://code.google.com/p/dart/issues/detail?id=3712
2237 */ 2258 */
2238 public void test_typesPropagation_parameterOfClosure_invocationNormalParameter () throws Exception { 2259 public void test_typesPropagation_parameterOfClosure_invocationNormalParameter () throws Exception {
2239 AnalyzeLibraryResult libraryResult = analyzeLibrary( 2260 analyzeLibrary(
2240 "// filler filler filler filler filler filler filler filler filler fille r", 2261 "// filler filler filler filler filler filler filler filler filler fille r",
2241 "class Event {}", 2262 "class Event {}",
2242 "typedef void EventListener(Event event);", 2263 "typedef void EventListener(Event event);",
2243 "foo(EventListener listener) {", 2264 "foo(EventListener listener) {",
2244 "}", 2265 "}",
2245 "main() {", 2266 "main() {",
2246 " foo((e) {", 2267 " foo((e) {",
2247 " var v = e;", 2268 " var v = e;",
2248 " });", 2269 " });",
2249 "}", 2270 "}",
2250 ""); 2271 "");
2251 assertInferredElementTypeString(libraryResult, "v", "Event"); 2272 assertInferredElementTypeString(testUnit, "v", "Event");
2252 } 2273 }
2253 2274
2254 /** 2275 /**
2255 * <p> 2276 * <p>
2256 * http://code.google.com/p/dart/issues/detail?id=3712 2277 * http://code.google.com/p/dart/issues/detail?id=3712
2257 */ 2278 */
2258 public void test_typesPropagation_parameterOfClosure_invocationNamedPositional Parameter() throws Exception { 2279 public void test_typesPropagation_parameterOfClosure_invocationNamedPositional Parameter() throws Exception {
2259 AnalyzeLibraryResult libraryResult = analyzeLibrary( 2280 analyzeLibrary(
2260 "// filler filler filler filler filler filler filler filler filler fille r", 2281 "// filler filler filler filler filler filler filler filler filler fille r",
2261 "class Event {}", 2282 "class Event {}",
2262 "typedef void EventListener(Event event);", 2283 "typedef void EventListener(Event event);",
2263 "foo([EventListener listener]) {", 2284 "foo([EventListener listener]) {",
2264 "}", 2285 "}",
2265 "main() {", 2286 "main() {",
2266 " foo((e) {", 2287 " foo((e) {",
2267 " var v = e;", 2288 " var v = e;",
2268 " });", 2289 " });",
2269 "}", 2290 "}",
2270 ""); 2291 "");
2271 assertInferredElementTypeString(libraryResult, "v", "Event"); 2292 assertInferredElementTypeString(testUnit, "v", "Event");
2272 } 2293 }
2273 2294
2274 /** 2295 /**
2275 * <p> 2296 * <p>
2276 * http://code.google.com/p/dart/issues/detail?id=3712 2297 * http://code.google.com/p/dart/issues/detail?id=3712
2277 */ 2298 */
2278 public void test_typesPropagation_parameterOfClosure_invocationNamedParameter( ) throws Exception { 2299 public void test_typesPropagation_parameterOfClosure_invocationNamedParameter( ) throws Exception {
2279 AnalyzeLibraryResult libraryResult = analyzeLibrary( 2300 analyzeLibrary(
2280 "// filler filler filler filler filler filler filler filler filler fille r", 2301 "// filler filler filler filler filler filler filler filler filler fille r",
2281 "class Event {}", 2302 "class Event {}",
2282 "typedef void EventListener(Event event);", 2303 "typedef void EventListener(Event event);",
2283 "foo([EventListener listener]) {", 2304 "foo([EventListener listener]) {",
2284 "}", 2305 "}",
2285 "main() {", 2306 "main() {",
2286 " foo(listener: (e) {", 2307 " foo(listener: (e) {",
2287 " var v = e;", 2308 " var v = e;",
2288 " });", 2309 " });",
2289 "}", 2310 "}",
2290 ""); 2311 "");
2291 assertInferredElementTypeString(libraryResult, "v", "Event"); 2312 assertInferredElementTypeString(testUnit, "v", "Event");
2292 } 2313 }
2293 2314
2294 /** 2315 /**
2295 * http://code.google.com/p/dart/issues/detail?id=3712 2316 * http://code.google.com/p/dart/issues/detail?id=3712
2296 */ 2317 */
2297 public void test_typesPropagation_parameterOfClosure_invocationOfMethod() thro ws Exception { 2318 public void test_typesPropagation_parameterOfClosure_invocationOfMethod() thro ws Exception {
2298 AnalyzeLibraryResult libraryResult = analyzeLibrary( 2319 analyzeLibrary(
2299 "// filler filler filler filler filler filler filler filler filler fille r", 2320 "// filler filler filler filler filler filler filler filler filler fille r",
2300 "class Event {}", 2321 "class Event {}",
2301 "typedef void EventListener(Event event);", 2322 "typedef void EventListener(Event event);",
2302 "class Button {", 2323 "class Button {",
2303 " onClick(EventListener listener) {", 2324 " onClick(EventListener listener) {",
2304 " }", 2325 " }",
2305 "}", 2326 "}",
2306 "main() {", 2327 "main() {",
2307 " Button button = new Button();", 2328 " Button button = new Button();",
2308 " button.onClick((e) {", 2329 " button.onClick((e) {",
2309 " var v = e;", 2330 " var v = e;",
2310 " });", 2331 " });",
2311 "}", 2332 "}",
2312 ""); 2333 "");
2313 assertInferredElementTypeString(libraryResult, "v", "Event"); 2334 assertInferredElementTypeString(testUnit, "v", "Event");
2314 } 2335 }
2315 2336
2316 /** 2337 /**
2317 * We should infer closure parameter types even in {@link FunctionType} is spe cified directly, 2338 * We should infer closure parameter types even in {@link FunctionType} is spe cified directly,
2318 * without using {@link FunctionAliasType}. 2339 * without using {@link FunctionAliasType}.
2319 */ 2340 */
2320 public void test_typesPropagation_parameterOfClosure_functionType() throws Exc eption { 2341 public void test_typesPropagation_parameterOfClosure_functionType() throws Exc eption {
2321 AnalyzeLibraryResult libraryResult = analyzeLibrary( 2342 analyzeLibrary(
2322 "// filler filler filler filler filler filler filler filler filler fille r", 2343 "// filler filler filler filler filler filler filler filler filler fille r",
2323 "class Event {}", 2344 "class Event {}",
2324 "class Button<T> {", 2345 "class Button<T> {",
2325 " onClick(listener(T e)) {", 2346 " onClick(listener(T e)) {",
2326 " }", 2347 " }",
2327 "}", 2348 "}",
2328 "main() {", 2349 "main() {",
2329 " var button = new Button<Event>();", 2350 " var button = new Button<Event>();",
2330 " button.onClick((e) {", 2351 " button.onClick((e) {",
2331 " var v = e;", 2352 " var v = e;",
2332 " });", 2353 " });",
2333 "}", 2354 "}",
2334 ""); 2355 "");
2335 assertInferredElementTypeString(libraryResult, "v", "Event"); 2356 assertInferredElementTypeString(testUnit, "v", "Event");
2336 } 2357 }
2337 2358
2338 public void test_getType_binaryExpression() throws Exception { 2359 public void test_getType_binaryExpression() throws Exception {
2339 AnalyzeLibraryResult libraryResult = analyzeLibrary( 2360 analyzeLibrary(
2340 "f(var arg) {", 2361 "f(var arg) {",
2341 " var v1 = 1 + 2;", 2362 " var v1 = 1 + 2;",
2342 " var v2 = 1 - 2;", 2363 " var v2 = 1 - 2;",
2343 " var v3 = 1 * 2;", 2364 " var v3 = 1 * 2;",
2344 " var v4 = 1 ~/ 2;", 2365 " var v4 = 1 ~/ 2;",
2345 " var v5 = 1 % 2;", 2366 " var v5 = 1 % 2;",
2346 " var v6 = 1 / 2;", 2367 " var v6 = 1 / 2;",
2347 " var v7 = 1.0 + 2;", 2368 " var v7 = 1.0 + 2;",
2348 " var v8 = 1 + 2.0;", 2369 " var v8 = 1 + 2.0;",
2349 " var v9 = 1 - 2.0;", 2370 " var v9 = 1 - 2.0;",
2350 " var v10 = 1.0 - 2;", 2371 " var v10 = 1.0 - 2;",
2351 " var v11 = 1 * 2.0;", 2372 " var v11 = 1 * 2.0;",
2352 " var v12 = 1.0 * 2;", 2373 " var v12 = 1.0 * 2;",
2353 " var v13 = 1.0 / 2;", 2374 " var v13 = 1.0 / 2;",
2354 " var v14 = 1 / 2.0;", 2375 " var v14 = 1 / 2.0;",
2355 " var v15 = 1.0 ~/ 2.0;", 2376 " var v15 = 1.0 ~/ 2.0;",
2356 " var v16 = 1.0 ~/ 2;", 2377 " var v16 = 1.0 ~/ 2;",
2357 " var v17 = arg as int", 2378 " var v17 = arg as int",
2358 "}", 2379 "}",
2359 ""); 2380 "");
2360 assertInferredElementTypeString(libraryResult, "v1", "int"); 2381 assertInferredElementTypeString(testUnit, "v1", "int");
2361 assertInferredElementTypeString(libraryResult, "v2", "int"); 2382 assertInferredElementTypeString(testUnit, "v2", "int");
2362 assertInferredElementTypeString(libraryResult, "v3", "int"); 2383 assertInferredElementTypeString(testUnit, "v3", "int");
2363 assertInferredElementTypeString(libraryResult, "v4", "int"); 2384 assertInferredElementTypeString(testUnit, "v4", "int");
2364 assertInferredElementTypeString(libraryResult, "v5", "int"); 2385 assertInferredElementTypeString(testUnit, "v5", "int");
2365 assertInferredElementTypeString(libraryResult, "v6", "double"); 2386 assertInferredElementTypeString(testUnit, "v6", "double");
2366 assertInferredElementTypeString(libraryResult, "v7", "double"); 2387 assertInferredElementTypeString(testUnit, "v7", "double");
2367 assertInferredElementTypeString(libraryResult, "v8", "double"); 2388 assertInferredElementTypeString(testUnit, "v8", "double");
2368 assertInferredElementTypeString(libraryResult, "v9", "double"); 2389 assertInferredElementTypeString(testUnit, "v9", "double");
2369 assertInferredElementTypeString(libraryResult, "v10", "double"); 2390 assertInferredElementTypeString(testUnit, "v10", "double");
2370 assertInferredElementTypeString(libraryResult, "v11", "double"); 2391 assertInferredElementTypeString(testUnit, "v11", "double");
2371 assertInferredElementTypeString(libraryResult, "v12", "double"); 2392 assertInferredElementTypeString(testUnit, "v12", "double");
2372 assertInferredElementTypeString(libraryResult, "v13", "double"); 2393 assertInferredElementTypeString(testUnit, "v13", "double");
2373 assertInferredElementTypeString(libraryResult, "v14", "double"); 2394 assertInferredElementTypeString(testUnit, "v14", "double");
2374 assertInferredElementTypeString(libraryResult, "v15", "double"); 2395 assertInferredElementTypeString(testUnit, "v15", "double");
2375 assertInferredElementTypeString(libraryResult, "v16", "double"); 2396 assertInferredElementTypeString(testUnit, "v16", "double");
2376 assertInferredElementTypeString(libraryResult, "v17", "int"); 2397 assertInferredElementTypeString(testUnit, "v17", "int");
2377 } 2398 }
2378 2399
2379 /** 2400 /**
2380 * It was requested that even if Editor can be helpful and warn about types in compatibility, it 2401 * It was requested that even if Editor can be helpful and warn about types in compatibility, it
2381 * should not do this to completely satisfy specification. 2402 * should not do this to completely satisfy specification.
2382 * <p> 2403 * <p>
2383 * http://code.google.com/p/dart/issues/detail?id=3223 2404 * http://code.google.com/p/dart/issues/detail?id=3223
2384 */ 2405 */
2385 public void test_typesPropagation_noExtraWarnings() throws Exception { 2406 public void test_typesPropagation_noExtraWarnings() throws Exception {
2386 AnalyzeLibraryResult libraryResult = analyzeLibrary( 2407 AnalyzeLibraryResult libraryResult = analyzeLibrary(
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
2419 " var a = new A();", 2440 " var a = new A();",
2420 " var v1 = a.intProperty;", 2441 " var v1 = a.intProperty;",
2421 " var v2 = a.boolProperty;", 2442 " var v2 = a.boolProperty;",
2422 " if (a.boolProperty) {", 2443 " if (a.boolProperty) {",
2423 " }", 2444 " }",
2424 " if (!a.boolProperty) {", 2445 " if (!a.boolProperty) {",
2425 " }", 2446 " }",
2426 "}", 2447 "}",
2427 ""); 2448 "");
2428 assertErrors(libraryResult.getErrors()); 2449 assertErrors(libraryResult.getErrors());
2429 assertInferredElementTypeString(libraryResult, "v1", "int"); 2450 assertInferredElementTypeString(testUnit, "v1", "int");
2430 assertInferredElementTypeString(libraryResult, "v2", "bool"); 2451 assertInferredElementTypeString(testUnit, "v2", "bool");
2431 } 2452 }
2432 2453
2433 public void test_getType_getterInNegation_generic() throws Exception { 2454 public void test_getType_getterInNegation_generic() throws Exception {
2434 AnalyzeLibraryResult libraryResult = analyzeLibrary( 2455 AnalyzeLibraryResult libraryResult = analyzeLibrary(
2435 "class A<T> {", 2456 "class A<T> {",
2436 " T field;", 2457 " T field;",
2437 " T get prop() => null;", 2458 " T get prop() => null;",
2438 "}", 2459 "}",
2439 "f() {", 2460 "f() {",
2440 " var a = new A<bool>();", 2461 " var a = new A<bool>();",
2441 " var v1 = a.field;", 2462 " var v1 = a.field;",
2442 " var v2 = a.prop;", 2463 " var v2 = a.prop;",
2443 " if (a.field) {", 2464 " if (a.field) {",
2444 " }", 2465 " }",
2445 " if (!a.field) {", 2466 " if (!a.field) {",
2446 " }", 2467 " }",
2447 " if (a.prop) {", 2468 " if (a.prop) {",
2448 " }", 2469 " }",
2449 " if (!a.prop) {", 2470 " if (!a.prop) {",
2450 " }", 2471 " }",
2451 "}", 2472 "}",
2452 ""); 2473 "");
2453 assertErrors(libraryResult.getErrors()); 2474 assertErrors(libraryResult.getErrors());
2454 assertInferredElementTypeString(libraryResult, "v1", "bool"); 2475 assertInferredElementTypeString(testUnit, "v1", "bool");
2455 assertInferredElementTypeString(libraryResult, "v2", "bool"); 2476 assertInferredElementTypeString(testUnit, "v2", "bool");
2456 } 2477 }
2457 2478
2458 public void test_getType_getterInSwitch_default() throws Exception { 2479 public void test_getType_getterInSwitch_default() throws Exception {
2459 AnalyzeLibraryResult libraryResult = analyzeLibrary( 2480 AnalyzeLibraryResult libraryResult = analyzeLibrary(
2460 "// filler filler filler filler filler filler filler filler filler fille r", 2481 "// filler filler filler filler filler filler filler filler filler fille r",
2461 "int get foo() {}", 2482 "int get foo() {}",
2462 "f() {", 2483 "f() {",
2463 " switch (true) {", 2484 " switch (true) {",
2464 " default:", 2485 " default:",
2465 " int v = foo;", 2486 " int v = foo;",
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
2502 " switch (a.foo) {", 2523 " switch (a.foo) {",
2503 " case 2:", 2524 " case 2:",
2504 " break;", 2525 " break;",
2505 " }", 2526 " }",
2506 "}", 2527 "}",
2507 ""); 2528 "");
2508 assertErrors(libraryResult.getErrors()); 2529 assertErrors(libraryResult.getErrors());
2509 } 2530 }
2510 2531
2511 /** 2532 /**
2512 * Asserts that {@link Element} with given name has expected type.
2513 */
2514 private void assertInferredElementTypeString(
2515 AnalyzeLibraryResult libraryResult,
2516 String variableName,
2517 String expectedType) {
2518 // find element
2519 Element element = getNamedElement(libraryResult, variableName);
2520 assertNotNull(element);
2521 // check type
2522 Type actualType = element.getType();
2523 assertEquals(element.getName(), expectedType, actualType.toString());
2524 // should be inferred
2525 if (TypeKind.of(actualType) != TypeKind.DYNAMIC) {
2526 assertTrue("Should be marked as inferred", actualType.isInferred());
2527 }
2528 }
2529
2530 /**
2531 * @return the {@link Element} with given name, may be <code>null</code>.
2532 */
2533 private Element getNamedElement(AnalyzeLibraryResult libraryResult, final Stri ng name) {
2534 DartUnit unit = libraryResult.getLibraryUnitResult().getUnit(getName());
2535 final Element[] result = {null};
2536 unit.accept(new ASTVisitor<Void>() {
2537 @Override
2538 public Void visitIdentifier(DartIdentifier node) {
2539 Element element = node.getElement();
2540 if (element != null && element.getName().equals(name)) {
2541 result[0] = element;
2542 }
2543 return super.visitIdentifier(node);
2544 }
2545 });
2546 return result[0];
2547 }
2548
2549 /**
2550 * <p> 2533 * <p>
2551 * http://code.google.com/p/dart/issues/detail?id=3272 2534 * http://code.google.com/p/dart/issues/detail?id=3272
2552 */ 2535 */
2553 public void test_assignVoidToDynamic() throws Exception { 2536 public void test_assignVoidToDynamic() throws Exception {
2554 AnalyzeLibraryResult libraryResult = analyzeLibrary( 2537 AnalyzeLibraryResult libraryResult = analyzeLibrary(
2555 "// filler filler filler filler filler filler filler filler filler fille r", 2538 "// filler filler filler filler filler filler filler filler filler fille r",
2556 "void foo() {}", 2539 "void foo() {}",
2557 "main() {", 2540 "main() {",
2558 " var v = foo();", 2541 " var v = foo();",
2559 "}", 2542 "}",
(...skipping 650 matching lines...) Expand 10 before | Expand all | Expand 10 after
3210 && index < sourceInfo.getEnd() 3193 && index < sourceInfo.getEnd()
3211 && clazz.isInstance(node)) { 3194 && clazz.isInstance(node)) {
3212 result.set((T) node); 3195 result.set((T) node);
3213 } 3196 }
3214 return super.visitNode(node); 3197 return super.visitNode(node);
3215 } 3198 }
3216 }); 3199 });
3217 return result.get(); 3200 return result.get();
3218 } 3201 }
3219 } 3202 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698