diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java index c962862e4bf7d..998d4f126a1fe 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java @@ -2712,7 +2712,24 @@ List arrayInitializerElements(int newpos, JCExpression t) { /** VariableInitializer = ArrayInitializer | Expression */ public JCExpression variableInitializer() { - return token.kind == LBRACE ? arrayInitializer(token.pos, null) : parseExpression(); + return this.variableInitializer(null); + } + + public JCExpression variableInitializer(JCExpression type) { + if (token.kind == LBRACE) { + if (type instanceof JCIdent && ((JCIdent) type).name.equals(names.fromString("Map"))) { + return mapInitializer(token.pos); + } else { + return arrayInitializer(token.pos, null); + } + } + return parseExpression(); + } + + private JCExpression mapInitializer(int pos) { + accept(LBRACE); + accept(RBRACE); + return F.at(pos).NewMap(); } /** ParExpression = "(" Expression ")" @@ -3699,7 +3716,7 @@ JCVariableDecl variableDeclaratorRest(int pos, JCModifiers mods, JCExpression ty if (token.kind == EQ) { nextToken(); - init = variableInitializer(); + init = variableInitializer(type); } else if (reqInit) syntaxError(token.pos, Errors.Expected(EQ)); diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/TreeMaker.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/TreeMaker.java index 21ced44c80ebc..3d32eb3bff88a 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/TreeMaker.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/TreeMaker.java @@ -435,6 +435,17 @@ public JCNewArray NewArray(JCExpression elemtype, return tree; } + public JCExpression NewMap() { + JCFieldAccess util = new JCFieldAccess(Ident(names.fromString("java")), names.fromString("util"), null); + JCFieldAccess map = new JCFieldAccess(util, names.fromString("Map"), null); + JCFieldAccess of = new JCFieldAccess(map, names.fromString("of"), null); + + JCMethodInvocation invocation = new JCMethodInvocation(List.nil(), of, List.nil()); + invocation.pos = pos; + + return invocation; + } + public JCLambda Lambda(List params, JCTree body) { diff --git a/test/jdk/java/util/Map/ViqueenSyntaxSugarMapTest.java b/test/jdk/java/util/Map/ViqueenSyntaxSugarMapTest.java new file mode 100644 index 0000000000000..42450f244bb68 --- /dev/null +++ b/test/jdk/java/util/Map/ViqueenSyntaxSugarMapTest.java @@ -0,0 +1,18 @@ +/* + * @test + * @run testng ViqueenSyntaxSugarMapTest + * @author Hasnae R. + */ +import java.util.Map; +import org.testng.annotations.Test; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; + +public class ViqueenSyntaxSugarMapTest { + @Test + public void testEmptyMap() { + Map empty = {}; + assertTrue(empty.isEmpty()); + } +}