OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 } |
OLD | NEW |