You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@netbeans.apache.org by ge...@apache.org on 2018/03/20 12:22:52 UTC

[incubator-netbeans] branch master updated: [NETBEANS 470] Var shows as keyword in jdk8, 9 (#457)

This is an automated email from the ASF dual-hosted git repository.

geertjan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-netbeans.git


The following commit(s) were added to refs/heads/master by this push:
     new 5f54ed3  [NETBEANS 470] Var shows as keyword in jdk8, 9 (#457)
5f54ed3 is described below

commit 5f54ed374961d028c8e4ebb1a09d8e8dce936c99
Author: Reema Taneja <32...@users.noreply.github.com>
AuthorDate: Tue Mar 20 17:52:50 2018 +0530

    [NETBEANS 470] Var shows as keyword in jdk8, 9 (#457)
    
    * pass version as inputattribute
    
    * removed redundant indexof check
---
 .../org/netbeans/modules/editor/java/JavaKit.java  |  3 ++
 java.lexer/nbproject/project.properties            |  2 +-
 .../src/org/netbeans/lib/java/lexer/JavaLexer.java | 33 ++++++++++++++++--
 .../lib/java/lexer/JavaLexerBatchTest.java         | 39 ++++++++++++++++++++++
 .../source/parsing/AbstractSourceFileObject.java   |  6 ++++
 5 files changed, 80 insertions(+), 3 deletions(-)

diff --git a/java.editor/src/org/netbeans/modules/editor/java/JavaKit.java b/java.editor/src/org/netbeans/modules/editor/java/JavaKit.java
index 0edbc11..69a69c4 100644
--- a/java.editor/src/org/netbeans/modules/editor/java/JavaKit.java
+++ b/java.editor/src/org/netbeans/modules/editor/java/JavaKit.java
@@ -146,6 +146,9 @@ public class JavaKit extends NbEditorKit {
             FileObject fo = NbEditorUtilities.getFileObject(doc);
             return fo != null ? fo.getNameExt() : null;
         }, true);
+        attrs.setValue(JavaTokenId.language(), "version", (Supplier<String>) () -> { //NOI18N
+            return getSourceLevel(doc);
+        }, true);
         doc.putProperty(InputAttributes.class, attrs);
       }
     
diff --git a/java.lexer/nbproject/project.properties b/java.lexer/nbproject/project.properties
index a079972..674c6bf 100644
--- a/java.lexer/nbproject/project.properties
+++ b/java.lexer/nbproject/project.properties
@@ -17,7 +17,7 @@
 
 is.autoload=true
 javac.compilerargs=-Xlint:unchecked
-javac.source=1.7
+javac.source=1.8
 javadoc.title=Java Lexer API
 javadoc.apichanges=${basedir}/apichanges.xml
 
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 0739cde..7aa0a6d 100644
--- a/java.lexer/src/org/netbeans/lib/java/lexer/JavaLexer.java
+++ b/java.lexer/src/org/netbeans/lib/java/lexer/JavaLexer.java
@@ -56,7 +56,7 @@ public class JavaLexer implements Lexer<JavaTokenId> {
     private final int version;
     
     private Integer state = null;
-
+    
     public JavaLexer(LexerRestartInfo<JavaTokenId> info) {
         this.input = info.input();
         this.tokenFactory = info.tokenFactory();
@@ -68,7 +68,16 @@ public class JavaLexer implements Lexer<JavaTokenId> {
             }
         }
         
-        Integer ver = (Integer)info.getAttributeValue("version"); //NOI18N
+        Integer ver = null;
+        Object verAttribute = info.getAttributeValue("version"); //NOI18N 
+        if (verAttribute instanceof Supplier) {
+            Object val = ((Supplier) verAttribute).get();
+            if (val instanceof String) {
+                ver = getVersionAsInt(((Supplier<String>) (verAttribute)).get());
+            }
+        } else if (verAttribute instanceof Integer) {
+            ver = (Integer) verAttribute;
+        }
         this.version = (ver != null) ? ver.intValue() : 10; // TODO: Java 1.8 used by default        
     }
     
@@ -1297,6 +1306,26 @@ public class JavaLexer implements Lexer<JavaTokenId> {
             JavaTokenId.LINE_COMMENT, JavaTokenId.WHITESPACE
     );
 
+    // Get version as Integer x for version String 1.x
+    private Integer getVersionAsInt(String version) {
+        Integer ver = null;
+        if (version != null) {
+            try {
+                // expect format 1.x or x
+                if (version.startsWith("1.")) { //NOI18N
+                    ver = Integer.parseInt(version.substring(2));
+                } else {
+                    ver = Integer.parseInt(version);
+                }
+            } catch (NumberFormatException e) {
+                // should not happen if version is
+                // set using SourceLevelQuery,
+                // ignore other strings
+            }
+        }
+        return ver;
+    }
+
     public void release() {
     }
 
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 6028695..927d2eb 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
@@ -20,6 +20,7 @@
 package org.netbeans.lib.java.lexer;
 
 import java.util.EnumSet;
+import java.util.function.Supplier;
 import junit.framework.TestCase;
 import org.netbeans.api.java.lexer.JavaStringTokenId;
 import org.netbeans.api.java.lexer.JavaTokenId;
@@ -595,4 +596,42 @@ public class JavaLexerBatchTest extends TestCase {
         LexerTestUtilities.assertNextTokenEquals(ts, JavaTokenId.RPAREN, ")");
         LexerTestUtilities.assertNextTokenEquals(ts, JavaTokenId.SEMICOLON, ";");
     }
+    
+    public void testVarKeywordWithStringVersion() {
+        String text = "var /*comment*/ /**comment*/ var = 0;";
+        InputAttributes attr = new InputAttributes();
+        attr.setValue(JavaTokenId.language(), "version", (Supplier<String>) () -> {return "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.BLOCK_COMMENT, "/*comment*/");
+        LexerTestUtilities.assertNextTokenEquals(ts, JavaTokenId.WHITESPACE, " ");
+        LexerTestUtilities.assertNextTokenEquals(ts, JavaTokenId.JAVADOC_COMMENT, "/**comment*/");
+        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, ";");
+    }
+
+    public void testVarIdentWithStringVersion() {
+        String text = "var var = 0;";
+        InputAttributes attr = new InputAttributes();
+        attr.setValue(JavaTokenId.language(), "version", (Supplier<String>) () -> {return "1.8";}, true);
+        TokenHierarchy<?> hi = TokenHierarchy.create(text, false, JavaTokenId.language(), EnumSet.noneOf(JavaTokenId.class), attr);
+        TokenSequence<?> ts = hi.tokenSequence();
+
+        LexerTestUtilities.assertNextTokenEquals(ts, JavaTokenId.IDENTIFIER, "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, ";");
+    }
 }
diff --git a/java.source.base/src/org/netbeans/modules/java/source/parsing/AbstractSourceFileObject.java b/java.source.base/src/org/netbeans/modules/java/source/parsing/AbstractSourceFileObject.java
index f1227be..9e31f2b 100644
--- a/java.source.base/src/org/netbeans/modules/java/source/parsing/AbstractSourceFileObject.java
+++ b/java.source.base/src/org/netbeans/modules/java/source/parsing/AbstractSourceFileObject.java
@@ -41,6 +41,7 @@ import org.netbeans.api.annotations.common.CheckForNull;
 import org.netbeans.api.annotations.common.NonNull;
 import org.netbeans.api.annotations.common.NullAllowed;
 import org.netbeans.api.java.lexer.JavaTokenId;
+import org.netbeans.api.java.queries.SourceLevelQuery;
 import org.netbeans.api.lexer.InputAttributes;
 import org.netbeans.api.lexer.TokenHierarchy;
 import org.netbeans.api.queries.FileEncodingQuery;
@@ -303,6 +304,11 @@ public abstract class AbstractSourceFileObject implements PrefetchableJavaFileOb
             final CharBuffer charBuffer = getCharContent(true);
             InputAttributes attrs = new InputAttributes();
             attrs.setValue(JavaTokenId.language(), "fileName", (Supplier<String>) () -> getName(), true); //NOI18N            
+            attrs.setValue(JavaTokenId.language(), "version", (Supplier<String>) () -> { //NOI18N  
+                FileObject fo = handle.resolveFileObject(false);
+                return (fo != null) ? SourceLevelQuery.getSourceLevel(fo) : null;
+            }, true);         
+  
             this.tokens = TokenHierarchy.create(charBuffer, false, JavaTokenId.language(), null, attrs); //TODO: .createSnapshot();
         }
         return this.tokens;

-- 
To stop receiving notification emails like this one, please contact
geertjan@apache.org.

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@netbeans.apache.org
For additional commands, e-mail: commits-help@netbeans.apache.org

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists