google / closure-compiler

A JavaScript checker and optimizer.
https://developers.google.com/closure/compiler/
Apache License 2.0
7.4k stars 1.15k forks source link

Object literal keys with "." in the name cause compiler error #2716

Closed stevendwood closed 6 years ago

stevendwood commented 6 years ago

I think this is the simplest reproduction of the issue :

(function() { var MAP = { "com.foo.bar.baz": "bang" }; }());

It works if you remove the function wrapper and if you reference the MAP and the property.

The exception is

23: java.lang.IllegalStateException: Invalid name 'JSCompiler_object_inline_com.foo.bar.baz_0'. Did you mean to use NodeUtil.newQName? at com.google.common.base.Preconditions.checkState(Preconditions.java:582) at com.google.javascript.rhino.IR.name(IR.java:385) at com.google.javascript.jscomp.NodeUtil.newVarNode(NodeUtil.java:4121) at com.google.javascript.jscomp.InlineObjectLiterals$InliningBehavior.splitObject(InlineObjectLiterals.java:421) at com.google.javascript.jscomp.InlineObjectLiterals$InliningBehavior.afterExitScope(InlineObjectLiterals.java:99) at com.google.javascript.jscomp.ReferenceCollectingCallback.exitScope(ReferenceCollectingCallback.java:250) at com.google.javascript.jscomp.NodeTraversal.popScope(NodeTraversal.java:917) at com.google.javascript.jscomp.NodeTraversal.popScope(NodeTraversal.java:908) at com.google.javascript.jscomp.NodeTraversal.traverseBlockScope(NodeTraversal.java:860) at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:767) at com.google.javascript.jscomp.NodeTraversal.traverseFunction(NodeTraversal.java:803) at com.google.javascript.jscomp.NodeTraversal.handleFunction(NodeTraversal.java:737) at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:753) at com.google.javascript.jscomp.NodeTraversal.traverseChildren(NodeTraversal.java:844) at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:769) at com.google.javascript.jscomp.NodeTraversal.traverseChildren(NodeTraversal.java:844) at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:769) at com.google.javascript.jscomp.NodeTraversal.traverseChildren(NodeTraversal.java:844) at com.google.javascript.jscomp.NodeTraversal.handleScript(NodeTraversal.java:725) at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:750) at com.google.javascript.jscomp.NodeTraversal.traverseChildren(NodeTraversal.java:844) at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:769) at com.google.javascript.jscomp.NodeTraversal.traverseRoots(NodeTraversal.java:327) at com.google.javascript.jscomp.ReferenceCollectingCallback.process(ReferenceCollectingCallback.java:113) at com.google.javascript.jscomp.InlineObjectLiterals.process(InlineObjectLiterals.java:65) at com.google.javascript.jscomp.PhaseOptimizer$NamedPass.process(PhaseOptimizer.java:304) at com.google.javascript.jscomp.PhaseOptimizer$Loop.process(PhaseOptimizer.java:451) at com.google.javascript.jscomp.PhaseOptimizer.process(PhaseOptimizer.java:230) at com.google.javascript.jscomp.Compiler.performOptimizations(Compiler.java:2580) at com.google.javascript.jscomp.Compiler$3.call(Compiler.java:841) at com.google.javascript.jscomp.Compiler$3.call(Compiler.java:837) at com.google.javascript.jscomp.CompilerExecutor.runInCompilerThread(CompilerExecutor.java:128) at com.google.javascript.jscomp.Compiler.runInCompilerThread(Compiler.java:869) at com.google.javascript.jscomp.Compiler.stage2Passes(Compiler.java:836) at com.google.javascript.jscomp.Compiler.compile(Compiler.java:730) at com.google.javascript.jscomp.webservice.backend.CompilerInvokerImpl.compile(CompilerInvokerImpl.java:46) at com.google.javascript.jscomp.webservice.backend.ServerController.executeRequest(ServerController.java:179) at com.google.javascript.jscomp.webservice.backend.CompilationRequestHandler.serviceParsedRequest(CompilationRequestHandler.java:178) at com.google.javascript.jscomp.webservice.backend.CompilationRequestHandler.service(CompilationRequestHandler.java:160) at com.google.javascript.jscomp.webservice.frontend.CompilationServlet.doPost(CompilationServlet.java:83) at javax.servlet.http.HttpServlet.service(HttpServlet.java:707) at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:848) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1772) at com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:125) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1759) at com.google.apphosting.runtime.jetty9.SaveSessionFilter.doFilter(SaveSessionFilter.java:37) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1759) at com.google.apphosting.utils.servlet.JdbcMySqlConnectionCleanupFilter.doFilter(JdbcMySqlConnectionCleanupFilter.java:60) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1759) at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:48) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1759) at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:582) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:524) at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226) at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1180) at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:512) at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185) at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1112) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) at com.google.apphosting.runtime.jetty9.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:297) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134) at org.eclipse.jetty.server.Server.handle(Server.java:534) at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:320) at com.google.apphosting.runtime.jetty9.RpcConnection.handle(RpcConnection.java:202) at com.google.apphosting.runtime.jetty9.RpcConnector.serviceRequest(RpcConnector.java:81) at com.google.apphosting.runtime.jetty9.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:108) at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.dispatchServletRequest(JavaRuntime.java:680) at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.dispatchRequest(JavaRuntime.java:642) at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:612) at com.google.apphosting.runtime.JavaRuntime$NullSandboxRequestRunnable.run(JavaRuntime.java:806) at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:274) at java.lang.Thread.run(Thread.java:745)

Original Post Data: output_format=json&output_info=compiled_code&output_info=warnings&output_info=errors&output_info=statistics&compilation_level=SIMPLE_OPTIMIZATIONS&warning_level=default&output_file_name=default.js&js_code=(function()%20%7B%0A%0A%20%20var%20MAP%20%3D%20%7B%0A%09%09%22com.foo.bar.baz%22%3A%20%22bang%22%0A%0A%09%7D%3B%0A%0A%7D())%3B

I'm trying to use closure from within a Java app - so if I could turn off the InlineObjectLiteral pass I guess that might also work, but I couldn't figure out how to do that, I tried CompilerOptions.setInlineVariables(false); to no avail. I don't own the code that's causing the failure.

lauraharker commented 6 years ago

You can turn off the InlineObjectLiteral pass with CompilerOptions.setCollapseObjectLiterals(false) - apologies for the confusing naming.

This should be simple to fix though, if we replace or remove all invalid JS identifier characters when generating names InlineObjectLiteral.

stevendwood commented 6 years ago

Thanks very much, setting that compileroptions flag got it compiling for now.

lauraharker commented 6 years ago

Submitted a fix internally. It should be pushed to Github soon.

MatrixFrog commented 6 years ago

@lauraharker If you write Fixes <issue URL> or Closes <issue URL> in the CL description, it will automatically close the bug on Github when it's pushed out. In this case it should be okay to close this now I think?

lauraharker commented 6 years ago

Got it, thanks Tyler.

Closing this issue.

stevendwood commented 6 years ago

Thanks for the quick turnaround @lauraharker !