You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@netbeans.apache.org by jl...@apache.org on 2017/10/09 19:19:09 UTC
incubator-netbeans git commit: Intial support for local variable type
inference.
Repository: incubator-netbeans
Updated Branches:
refs/heads/jdk18_3 [created] 49a172a3e
Intial support for local variable type inference.
Project: http://git-wip-us.apache.org/repos/asf/incubator-netbeans/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-netbeans/commit/49a172a3
Tree: http://git-wip-us.apache.org/repos/asf/incubator-netbeans/tree/49a172a3
Diff: http://git-wip-us.apache.org/repos/asf/incubator-netbeans/diff/49a172a3
Branch: refs/heads/jdk18_3
Commit: 49a172a3eef7c26bae0b08d25121a178cc38f5d0
Parents: 4e662ec
Author: Jan Lahoda <jl...@netbeans.org>
Authored: Mon Oct 9 20:57:56 2017 +0200
Committer: Jan Lahoda <jl...@netbeans.org>
Committed: Mon Oct 9 20:57:56 2017 +0200
----------------------------------------------------------------------
.../java/api/common/ui/PlatformUiSupport.java | 2 +-
.../java/completion/JavaCompletionTask.java | 2 +-
.../JavaCompletionTaskTest/10/emptyVar.pass | 138 +++++++++++++++++++
.../JavaCompletionTask110FeaturesTest.java | 50 +++++++
.../modules/editor/java/GoToSupportTest.java | 41 ++++++
java.lexer/manifest.mf | 2 +-
.../netbeans/api/java/lexer/JavaTokenId.java | 2 +
.../org/netbeans/lib/java/lexer/JavaLexer.java | 64 +++++++--
.../lib/java/lexer/JavaLexerBatchTest.java | 17 +++
9 files changed, 300 insertions(+), 18 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-netbeans/blob/49a172a3/java.api.common/src/org/netbeans/modules/java/api/common/ui/PlatformUiSupport.java
----------------------------------------------------------------------
diff --git a/java.api.common/src/org/netbeans/modules/java/api/common/ui/PlatformUiSupport.java b/java.api.common/src/org/netbeans/modules/java/api/common/ui/PlatformUiSupport.java
index 26a6b13..7d49102 100644
--- a/java.api.common/src/org/netbeans/modules/java/api/common/ui/PlatformUiSupport.java
+++ b/java.api.common/src/org/netbeans/modules/java/api/common/ui/PlatformUiSupport.java
@@ -1050,7 +1050,7 @@ public final class PlatformUiSupport {
private static int minor(@NonNull final SpecificationVersion specVer) {
final String s = specVer.toString();
final int split = s.indexOf('.'); //NOI18N
- return split < 0 ? 0 : Integer.parseInt(s.substring(split+1));
+ return split < 0 ? -1 : Integer.parseInt(s.substring(split+1));
}
private static int major(@NonNull final SpecificationVersion specVer) {
http://git-wip-us.apache.org/repos/asf/incubator-netbeans/blob/49a172a3/java.completion/src/org/netbeans/modules/java/completion/JavaCompletionTask.java
----------------------------------------------------------------------
diff --git a/java.completion/src/org/netbeans/modules/java/completion/JavaCompletionTask.java b/java.completion/src/org/netbeans/modules/java/completion/JavaCompletionTask.java
index 234e0b3..7bcf933 100644
--- a/java.completion/src/org/netbeans/modules/java/completion/JavaCompletionTask.java
+++ b/java.completion/src/org/netbeans/modules/java/completion/JavaCompletionTask.java
@@ -4910,7 +4910,7 @@ public final class JavaCompletionTask<T> extends BaseTask {
Tree tree = path.getLeaf();
switch (tree.getKind()) {
case VARIABLE:
- TypeMirror type = controller.getTrees().getTypeMirror(new TreePath(path, ((VariableTree) tree).getType()));
+ TypeMirror type = controller.getTrees().getTypeMirror(path);
if (type == null) {
return null;
}
http://git-wip-us.apache.org/repos/asf/incubator-netbeans/blob/49a172a3/java.completion/test/unit/data/goldenfiles/org/netbeans/modules/java/completion/JavaCompletionTaskTest/10/emptyVar.pass
----------------------------------------------------------------------
diff --git a/java.completion/test/unit/data/goldenfiles/org/netbeans/modules/java/completion/JavaCompletionTaskTest/10/emptyVar.pass b/java.completion/test/unit/data/goldenfiles/org/netbeans/modules/java/completion/JavaCompletionTaskTest/10/emptyVar.pass
new file mode 100644
index 0000000..2cad701
--- /dev/null
+++ b/java.completion/test/unit/data/goldenfiles/org/netbeans/modules/java/completion/JavaCompletionTaskTest/10/emptyVar.pass
@@ -0,0 +1,138 @@
+int a
+boolean b
+protected native Object clone()
+public boolean equals(Object arg0)
+protected void finalize()
+public final native Class<?> getClass()
+public native int hashCode()
+public final native void notify()
+public final native void notifyAll()
+public void op(int a, boolean b)
+public String toString()
+public final void wait()
+public final native void wait(long arg0)
+public final void wait(long arg0, int arg1)
+boolean
+byte
+char
+double
+false
+float
+int
+long
+new
+null
+short
+super
+this
+true
+AbstractMethodError
+Appendable
+ArithmeticException
+ArrayIndexOutOfBoundsException
+ArrayStoreException
+AssertionError
+AutoCloseable
+Boolean
+BootstrapMethodError
+Byte
+CharSequence
+Character
+Class
+ClassCastException
+ClassCircularityError
+ClassFormatError
+ClassLoader
+ClassNotFoundException
+ClassValue
+CloneNotSupportedException
+Cloneable
+Comparable
+Compiler
+Deprecated
+Double
+Enum
+EnumConstantNotPresentException
+Error
+Exception
+ExceptionInInitializerError
+Float
+FunctionalInterface
+IllegalAccessError
+IllegalAccessException
+IllegalArgumentException
+IllegalCallerException
+IllegalMonitorStateException
+IllegalStateException
+IllegalThreadStateException
+IncompatibleClassChangeError
+IndexOutOfBoundsException
+InheritableThreadLocal
+InstantiationError
+InstantiationException
+Integer
+InternalError
+InterruptedException
+Iterable
+LayerInstantiationException
+LinkageError
+Long
+Math
+Module
+ModuleLayer
+NegativeArraySizeException
+NoClassDefFoundError
+NoSuchFieldError
+NoSuchFieldException
+NoSuchMethodError
+NoSuchMethodException
+NullPointerException
+Number
+NumberFormatException
+Object
+OutOfMemoryError
+Override
+Package
+Process
+ProcessBuilder
+ProcessHandle
+Readable
+ReflectiveOperationException
+Runnable
+Runtime
+RuntimeException
+RuntimePermission
+SafeVarargs
+SecurityException
+SecurityManager
+Short
+StackOverflowError
+StackTraceElement
+StackWalker
+StrictMath
+String
+StringBuffer
+StringBuilder
+StringIndexOutOfBoundsException
+SuppressWarnings
+System
+Test
+Thread
+ThreadDeath
+ThreadGroup
+ThreadLocal
+Throwable
+TypeNotPresentException
+UnknownError
+UnsatisfiedLinkError
+UnsupportedClassVersionError
+UnsupportedOperationException
+VerifyError
+VirtualMachineError
+Void
+com
+java
+javax
+netscape
+org
+sun
http://git-wip-us.apache.org/repos/asf/incubator-netbeans/blob/49a172a3/java.completion/test/unit/src/org/netbeans/modules/java/completion/JavaCompletionTask110FeaturesTest.java
----------------------------------------------------------------------
diff --git a/java.completion/test/unit/src/org/netbeans/modules/java/completion/JavaCompletionTask110FeaturesTest.java b/java.completion/test/unit/src/org/netbeans/modules/java/completion/JavaCompletionTask110FeaturesTest.java
new file mode 100644
index 0000000..57a9f74
--- /dev/null
+++ b/java.completion/test/unit/src/org/netbeans/modules/java/completion/JavaCompletionTask110FeaturesTest.java
@@ -0,0 +1,50 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.java.completion;
+
+import javax.lang.model.SourceVersion;
+import org.netbeans.modules.java.source.parsing.JavacParser;
+
+/**
+ *
+ * @author Dusan Balek
+ */
+public class JavaCompletionTask110FeaturesTest extends CompletionTestBase {
+
+ public JavaCompletionTask110FeaturesTest(String testName) {
+ super(testName);
+ }
+
+ // Java 1.10 var tests -------------------------------------------
+
+ public void testVar() throws Exception {
+ try {
+ SourceVersion.valueOf("RELEASE_10");
+ } catch (IllegalArgumentException ex) {
+ //OK, no RELEASE_10, skip test:
+ return ;
+ }
+ //TODO: should not propose "null"!
+ performTest("Method", 125, "var v =", "emptyVar.pass", "1.10");
+ }
+
+ static {
+ JavacParser.DISABLE_SOURCE_LEVEL_DOWNGRADE = true;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-netbeans/blob/49a172a3/java.editor/test/unit/src/org/netbeans/modules/editor/java/GoToSupportTest.java
----------------------------------------------------------------------
diff --git a/java.editor/test/unit/src/org/netbeans/modules/editor/java/GoToSupportTest.java b/java.editor/test/unit/src/org/netbeans/modules/editor/java/GoToSupportTest.java
index bf44269..0ec9688 100644
--- a/java.editor/test/unit/src/org/netbeans/modules/editor/java/GoToSupportTest.java
+++ b/java.editor/test/unit/src/org/netbeans/modules/editor/java/GoToSupportTest.java
@@ -22,6 +22,7 @@ import java.io.File;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
import java.util.regex.Pattern;
+import javax.lang.model.SourceVersion;
import javax.lang.model.element.Element;
import javax.lang.model.element.ElementKind;
@@ -1008,6 +1009,46 @@ public class GoToSupportTest extends NbTestCase {
assertEquals(golden, tooltip);
}
+ public void testVar() throws Exception {
+ try {
+ SourceVersion.valueOf("RELEASE_10");
+ } catch (IllegalArgumentException ex) {
+ //OK, no RELEASE_10, skip test:
+ return ;
+ }
+ final boolean[] wasCalled = new boolean[1];
+ this.sourceLevel = "1.10";
+ final String code = "package test;\n" +
+ "public class Test {\n" +
+ " private static void method() {\n" +
+ " var var = 0;\n" +
+ " int i = va|r;\n" +
+ " }\n" +
+ "}\n";
+
+ performTest(code, new UiUtilsCaller() {
+ @Override public boolean open(FileObject fo, int pos) {
+ assertTrue(source == fo);
+ assertEquals(code.indexOf("var var = 0;"), pos);
+ wasCalled[0] = true;
+ return true;
+ }
+
+ @Override public void beep(boolean goToSource, boolean goToJavadoc) {
+ fail("Should not be called.");
+ }
+ @Override public boolean open(ClasspathInfo info, ElementHandle<?> el) {
+ fail("Should not be called.");
+ return true;
+ }
+ @Override public void warnCannotOpen(String displayName) {
+ fail("Should not be called.");
+ }
+ }, false, false);
+
+ assertTrue(wasCalled[0]);
+ }
+
private String sourceLevel = "1.5";
private FileObject source;
http://git-wip-us.apache.org/repos/asf/incubator-netbeans/blob/49a172a3/java.lexer/manifest.mf
----------------------------------------------------------------------
diff --git a/java.lexer/manifest.mf b/java.lexer/manifest.mf
index 0515a35..56e3b1c 100644
--- a/java.lexer/manifest.mf
+++ b/java.lexer/manifest.mf
@@ -1,5 +1,5 @@
OpenIDE-Module: org.netbeans.modules.java.lexer/1
OpenIDE-Module-Localizing-Bundle: org/netbeans/lib/java/lexer/Bundle.properties
-OpenIDE-Module-Specification-Version: 1.35
+OpenIDE-Module-Specification-Version: 1.36
OpenIDE-Module-Layer: org/netbeans/lib/java/lexer/layer.xml
http://git-wip-us.apache.org/repos/asf/incubator-netbeans/blob/49a172a3/java.lexer/src/org/netbeans/api/java/lexer/JavaTokenId.java
----------------------------------------------------------------------
diff --git a/java.lexer/src/org/netbeans/api/java/lexer/JavaTokenId.java b/java.lexer/src/org/netbeans/api/java/lexer/JavaTokenId.java
index c1e398b..1e08c52 100644
--- a/java.lexer/src/org/netbeans/api/java/lexer/JavaTokenId.java
+++ b/java.lexer/src/org/netbeans/api/java/lexer/JavaTokenId.java
@@ -113,6 +113,8 @@ public enum JavaTokenId implements TokenId {
UNDERSCORE("_", "keyword"),
/**@since 1.34*/
USES("uses", "keyword"),
+ /**@since 1.36*/
+ VAR("var", "keyword"),
VOID("void", "keyword"),
VOLATILE("volatile", "keyword"),
WHILE("while", "keyword-directive"),
http://git-wip-us.apache.org/repos/asf/incubator-netbeans/blob/49a172a3/java.lexer/src/org/netbeans/lib/java/lexer/JavaLexer.java
----------------------------------------------------------------------
diff --git a/java.lexer/src/org/netbeans/lib/java/lexer/JavaLexer.java b/java.lexer/src/org/netbeans/lib/java/lexer/JavaLexer.java
index baa31fe..e2d714e 100644
--- a/java.lexer/src/org/netbeans/lib/java/lexer/JavaLexer.java
+++ b/java.lexer/src/org/netbeans/lib/java/lexer/JavaLexer.java
@@ -1023,21 +1023,55 @@ public class JavaLexer implements Lexer<JavaTokenId> {
return finishIdentifier(c);
case 'v':
- if ((c = nextChar()) == 'o') {
- switch (c = nextChar()) {
- case 'i':
- if ((c = nextChar()) == 'd')
- return keywordOrIdentifier(JavaTokenId.VOID);
- break;
- case 'l':
- if ((c = nextChar()) == 'a'
- && (c = nextChar()) == 't'
- && (c = nextChar()) == 'i'
- && (c = nextChar()) == 'l'
- && (c = nextChar()) == 'e')
- return keywordOrIdentifier(JavaTokenId.VOLATILE);
- break;
- }
+ switch ((c = nextChar())) {
+ case 'a':
+ if ((c = nextChar()) == 'r') {
+ c = nextChar();
+ // Check whether the given char is non-ident and if so then return keyword
+ if (c == EOF || !Character.isJavaIdentifierPart(c = translateSurrogates(c))) {
+ // For surrogate 2 chars must be backed up
+ backup((c >= Character.MIN_SUPPLEMENTARY_CODE_POINT) ? 2 : 1);
+
+ int len = input.readLength();
+
+ Token next = nextToken();
+ boolean varKeyword = false;
+
+ if (next.id() == JavaTokenId.BLOCK_COMMENT ||
+ next.id() == JavaTokenId.JAVADOC_COMMENT ||
+ next.id() == JavaTokenId.LINE_COMMENT ||
+ next.id() == JavaTokenId.WHITESPACE) {
+ next = nextToken();
+
+ varKeyword = next.id() == JavaTokenId.IDENTIFIER;
+ }
+
+ input.backup(input.readLengthEOF()- len);
+
+ assert input.readLength() == len;
+
+ if (varKeyword)
+ return token(JavaTokenId.VAR);
+ }
+ }
+ c = nextChar();
+ break;
+ case 'o':
+ switch (c = nextChar()) {
+ case 'i':
+ if ((c = nextChar()) == 'd')
+ return keywordOrIdentifier(JavaTokenId.VOID);
+ break;
+ case 'l':
+ if ((c = nextChar()) == 'a'
+ && (c = nextChar()) == 't'
+ && (c = nextChar()) == 'i'
+ && (c = nextChar()) == 'l'
+ && (c = nextChar()) == 'e')
+ return keywordOrIdentifier(JavaTokenId.VOLATILE);
+ break;
+ }
+ break;
}
return finishIdentifier(c);
http://git-wip-us.apache.org/repos/asf/incubator-netbeans/blob/49a172a3/java.lexer/test/unit/src/org/netbeans/lib/java/lexer/JavaLexerBatchTest.java
----------------------------------------------------------------------
diff --git a/java.lexer/test/unit/src/org/netbeans/lib/java/lexer/JavaLexerBatchTest.java b/java.lexer/test/unit/src/org/netbeans/lib/java/lexer/JavaLexerBatchTest.java
index 427227f..84785c4 100644
--- a/java.lexer/test/unit/src/org/netbeans/lib/java/lexer/JavaLexerBatchTest.java
+++ b/java.lexer/test/unit/src/org/netbeans/lib/java/lexer/JavaLexerBatchTest.java
@@ -519,4 +519,21 @@ public class JavaLexerBatchTest extends TestCase {
LexerTestUtilities.assertNextTokenEquals(ts, JavaTokenId.ERROR, "\\");
LexerTestUtilities.assertNextTokenEquals(ts, JavaTokenId.IDENTIFIER, "u00");
}
+
+ public void testVar() {
+ String text = "var var = 0;";
+ InputAttributes attr = new InputAttributes();
+ attr.setValue(JavaTokenId.language(), "version", Integer.valueOf(10), true);
+ TokenHierarchy<?> hi = TokenHierarchy.create(text, false, JavaTokenId.language(), EnumSet.noneOf(JavaTokenId.class), attr);
+ TokenSequence<?> ts = hi.tokenSequence();
+
+ LexerTestUtilities.assertNextTokenEquals(ts, JavaTokenId.VAR, "var");
+ LexerTestUtilities.assertNextTokenEquals(ts, JavaTokenId.WHITESPACE, " ");
+ LexerTestUtilities.assertNextTokenEquals(ts, JavaTokenId.IDENTIFIER, "var");
+ LexerTestUtilities.assertNextTokenEquals(ts, JavaTokenId.WHITESPACE, " ");
+ LexerTestUtilities.assertNextTokenEquals(ts, JavaTokenId.EQ, "=");
+ LexerTestUtilities.assertNextTokenEquals(ts, JavaTokenId.WHITESPACE, " ");
+ LexerTestUtilities.assertNextTokenEquals(ts, JavaTokenId.INT_LITERAL, "0");
+ LexerTestUtilities.assertNextTokenEquals(ts, JavaTokenId.SEMICOLON, ";");
+ }
}