eclipse-archived / ceylon-ide-eclipse

Eclipse Plugin for Ceylon
http://ceylon-lang.org/documentation/ide
Eclipse Public License 1.0
59 stars 28 forks source link

Support NPM modules #1811

Closed FroMage closed 8 years ago

FroMage commented 8 years ago

If In the IDE I have a JS-only project, and add the following module imports:

    import "npm:express" "4.0.0";
    import "npm:body-parser" "1.0.2";
    import "npm:cors" "2.2.0";
    import "npm:fh-mbaas-api" "5.12.0";

The build will resolve them, however if I try to use them in a file:

import express { express }
import cors { cors }
import fh.mbaas.api { mbaasExpress }

...

I get one error on each package import:

Package not found in imported modules: fh.mbaas.api (add module import to module descriptor of fh.demo.hello)

I also get these exceptions in the console:

Exception trying to get Jar file '/home/stephane/node_modules/express/index.js' :
org.eclipse.core.runtime.CoreException: I/O exception
    at org.eclipse.jdt.internal.core.JavaModelManager.getZipFile(JavaModelManager.java:2756)
    at org.eclipse.jdt.internal.core.JavaModelManager.getZipFile(JavaModelManager.java:2715)
    at org.eclipse.jdt.internal.core.JarPackageFragmentRoot.getJar(JarPackageFragmentRoot.java:156)
    at com.redhat.ceylon.eclipse.core.model.JDTModule$1.$call$(JDTModule.ceylon:97)
    at com.redhat.ceylon.eclipse.core.model.JDTModule$1.$call$(JDTModule.ceylon:60)
    at com.redhat.ceylon.ide.common.util.synchronize_.synchronize(synchronize_.java:33)
    at com.redhat.ceylon.eclipse.core.model.JDTModule.getPackageFragmentRoots(JDTModule.ceylon:113)
    at com.redhat.ceylon.eclipse.core.model.JDTModule.listPackages(JDTModule.ceylon:128)
    at com.redhat.ceylon.ide.common.model.IdeModule.loadAllPackages$priv$(IdeModule.ceylon:610)
    at com.redhat.ceylon.ide.common.model.IdeModule.loadAllPackages$priv$(IdeModule.ceylon:619)
    at com.redhat.ceylon.ide.common.model.IdeModule.access$2000(IdeModule.ceylon:191)
    at com.redhat.ceylon.ide.common.model.IdeModule$15.$call$(IdeModule.ceylon:599)
    at com.redhat.ceylon.ide.common.model.IdeModule$15.$call$(IdeModule.ceylon:598)
    at com.redhat.ceylon.ide.common.util.synchronize_.synchronize(synchronize_.java:33)
    at com.redhat.ceylon.ide.common.model.IdeModule.getAllVisiblePackages(IdeModule.ceylon:601)
    at com.redhat.ceylon.ide.common.completion.PackageCompletion$impl.addPackageCompletionsFullPath$priv$(PackageCompletion.ceylon:66)
    at com.redhat.ceylon.ide.common.completion.PackageCompletion$impl.addPackageCompletions(PackageCompletion.ceylon:53)
    at com.redhat.ceylon.ide.common.completion.completionManager_.addPackageCompletions(IdeCompletionManager.ceylon)
    at com.redhat.ceylon.ide.common.completion.ImportVisitor.visit(ImportVisitor.ceylon:42)
    at com.redhat.ceylon.compiler.typechecker.tree.Tree$Import.visit(Tree.java:238)
    at com.redhat.ceylon.compiler.typechecker.tree.Walker.walkImportList(Walker.java:78)
    at com.redhat.ceylon.compiler.typechecker.tree.Tree$ImportList.visitChildren(Tree.java:218)
    at com.redhat.ceylon.compiler.typechecker.tree.Visitor.visitAny(Visitor.java:10)
    at com.redhat.ceylon.compiler.typechecker.tree.Visitor.visit(Visitor.java:17)
    at com.redhat.ceylon.compiler.typechecker.tree.Tree$ImportList.visit(Tree.java:210)
    at com.redhat.ceylon.compiler.typechecker.tree.Walker.walkCompilationUnit(Walker.java:16)
    at com.redhat.ceylon.compiler.typechecker.tree.Tree$CompilationUnit.visitChildren(Tree.java:30)
    at com.redhat.ceylon.compiler.typechecker.tree.Visitor.visitAny(Visitor.java:10)
    at com.redhat.ceylon.compiler.typechecker.tree.Visitor.visit(Visitor.java:12)
    at com.redhat.ceylon.ide.common.completion.completionManager_.constructCompletionsOutsideOrdinaryCode$priv$(IdeCompletionManager.ceylon:373)
    at com.redhat.ceylon.ide.common.completion.completionManager_.getContentProposals$canonical$(IdeCompletionManager.ceylon:235)
    at com.redhat.ceylon.ide.common.completion.completionManager_.getContentProposals(IdeCompletionManager.ceylon:107)
    at com.redhat.ceylon.eclipse.code.complete.CeylonCompletionProcessor.getContentProposals$priv$(CeylonCompletionProcessor.ceylon:162)
    at com.redhat.ceylon.eclipse.code.complete.CeylonCompletionProcessor.access$300(CeylonCompletionProcessor.ceylon:71)
    at com.redhat.ceylon.eclipse.code.complete.CeylonCompletionProcessor$1runnable_.run(CeylonCompletionProcessor.ceylon:125)
    at org.eclipse.jface.operation.ModalContext$ModalContextThread.run(ModalContext.java:119)
Caused by: java.util.zip.ZipException: error in opening zip file
    at java.util.zip.ZipFile.open(Native Method)
    at java.util.zip.ZipFile.<init>(ZipFile.java:219)
    at java.util.zip.ZipFile.<init>(ZipFile.java:149)
    at java.util.zip.ZipFile.<init>(ZipFile.java:163)
    at org.eclipse.jdt.internal.core.JavaModelManager.getZipFile(JavaModelManager.java:2749)
    ... 35 more
davidfestal commented 8 years ago

@FroMage: can you confirm this works as you were expecting ?

I tested on both eclipse and IntelliJ : The changes were done in ceylon-ide-common

FroMage commented 8 years ago

OK it works, thanks. I do get that exception when I save, though:

com.redhat.ceylon.compiler.java.runtime.metamodel.ModelError: Unsupported declaration type: class com.redhat.ceylon.model.typechecker.model.UnknownType
    at com.redhat.ceylon.compiler.java.runtime.metamodel.Metamodel.newModelError(Metamodel.java:1844)
    at com.redhat.ceylon.compiler.java.runtime.metamodel.Metamodel.newModelError(Metamodel.java:1839)
    at com.redhat.ceylon.compiler.java.runtime.metamodel.Metamodel.getTypeDescriptorForProducedType(Metamodel.java:916)
    at com.redhat.ceylon.compiler.java.runtime.metamodel.Metamodel.getTypeDescriptorsForProducedTypes(Metamodel.java:953)
    at com.redhat.ceylon.compiler.java.runtime.metamodel.Metamodel.getTypeDescriptorForProducedType(Metamodel.java:875)
    at com.redhat.ceylon.compiler.java.runtime.metamodel.Metamodel.getTypeDescriptorForArguments(Metamodel.java:1257)
    at com.redhat.ceylon.compiler.java.runtime.metamodel.Metamodel.getAppliedMetamodel(Metamodel.java:639)
    at com.redhat.ceylon.compiler.java.runtime.metamodel.Metamodel.getAppliedMetamodel(Metamodel.java:367)
    at ceylon.language.meta.typeLiteral_.typeLiteral(typeLiteral_.java:28)
    at com.redhat.ceylon.ide.common.model.delta.DeltaBuilderFactory$DeclarationDeltaBuilder.hasStructuralChanges(deltaBuilder.ceylon:691)
    at com.redhat.ceylon.ide.common.model.delta.DeltaBuilderFactory$TopLevelDeclarationDeltaBuilder.calculateLocalChanges(deltaBuilder.ceylon:902)
    at com.redhat.ceylon.ide.common.model.delta.DeltaBuilderFactory$DeltaBuilder.recurse(deltaBuilder.ceylon:172)
    at com.redhat.ceylon.ide.common.model.delta.DeltaBuilderFactory$TopLevelDeclarationDeltaBuilder.buildDelta(deltaBuilder.ceylon:871)
    at com.redhat.ceylon.ide.common.model.delta.DeltaBuilderFactory$RegularCompilationUnitDeltaBuilder.manageChildDelta(deltaBuilder.ceylon:472)
    at com.redhat.ceylon.ide.common.model.delta.DeltaBuilderFactory$DeltaBuilder.recurse(deltaBuilder.ceylon:221)
    at com.redhat.ceylon.ide.common.model.delta.DeltaBuilderFactory$RegularCompilationUnitDeltaBuilder.buildDelta(deltaBuilder.ceylon:457)
    at com.redhat.ceylon.ide.common.model.delta.DeltaBuilderFactory.buildCompilationUnitDeltas$priv$(deltaBuilder.ceylon:117)
    at com.redhat.ceylon.ide.common.model.delta.DeltaBuilderFactory.buildDeltas$canonical$(deltaBuilder.ceylon:94)
    at com.redhat.ceylon.ide.common.model.delta.DeltaBuilderFactory.buildDeltas(deltaBuilder.ceylon:83)
    at com.redhat.ceylon.ide.common.model.ProjectSourceFile.buildDeltaAgainstModel(ProjectSourceFile.ceylon:150)
    at com.redhat.ceylon.eclipse.core.builder.CeylonBuilder.searchForDependantFiles(CeylonBuilder.java:1474)
    at com.redhat.ceylon.eclipse.core.builder.CeylonBuilder.calculateDependencies(CeylonBuilder.java:1330)
    at com.redhat.ceylon.eclipse.core.builder.CeylonBuilder.build(CeylonBuilder.java:990)
    at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:735)
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
    at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:206)
    at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:246)
    at org.eclipse.core.internal.events.BuildManager$1.run(BuildManager.java:301)
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
    at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:304)
    at org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:360)
    at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:383)
    at org.eclipse.core.internal.events.AutoBuildJob.doBuild(AutoBuildJob.java:144)
    at org.eclipse.core.internal.events.AutoBuildJob.run(AutoBuildJob.java:235)
    at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55)

But it's not reflected in the IDE, so it's not problematic for my demo.

davidfestal commented 8 years ago

This is a known problem that is not related to the NPM support, and has already a pending issue. Anyway, do you confirm that the exception is only dumped on the output, but doesn't trigger a popup inside Eclipse ?

FroMage commented 8 years ago

Yes it's only in the output.

davidfestal commented 8 years ago

OK, let me close this issue then.

FroMage commented 8 years ago

Thanks