private KotlinEnvironment(@NotNull IJavaProject javaProject) {
    this.javaProject = javaProject;

    applicationEnvironment = createJavaCoreApplicationEnvironment();

    projectEnvironment = new JavaCoreProjectEnvironment(DISPOSABLE, applicationEnvironment);

    project = projectEnvironment.getProject();

    CoreExternalAnnotationsManager annotationsManager =
        new CoreExternalAnnotationsManager(project.getComponent(PsiManager.class));
    project.registerService(ExternalAnnotationsManager.class, annotationsManager);
    project.registerService(
        CoreJavaFileManager.class,
        (CoreJavaFileManager) ServiceManager.getService(project, JavaFileManager.class));

    CliLightClassGenerationSupport cliLightClassGenerationSupport =
        new CliLightClassGenerationSupport();
    project.registerService(LightClassGenerationSupport.class, cliLightClassGenerationSupport);
    project.registerService(CliLightClassGenerationSupport.class, cliLightClassGenerationSupport);
    project.registerService(
        KotlinLightClassForPackage.FileStubCache.class,
        new KotlinLightClassForPackage.FileStubCache(project));

    VirtualFile ktJDKAnnotations =
        PathUtil.jarFileOrDirectoryToVirtualFile(new File(KT_JDK_ANNOTATIONS_PATH));
    annotationsManager.addExternalAnnotationsRoot(ktJDKAnnotations);

    addJreClasspath();
    addSourcesToClasspath();
    addLibsToClasspath();

    project.registerService(
        VirtualFileFinderFactory.class, new EclipseVirtualFileFinder(classPath));

    CoreApplicationEnvironment.registerExtensionPoint(
        Extensions.getRootArea(),
        ClsCustomNavigationPolicy.EP_NAME,
        ClsCustomNavigationPolicy.class);
    CoreApplicationEnvironment.registerExtensionPoint(
        Extensions.getRootArea(),
        ClassFileDecompilers.EP_NAME,
        ClassFileDecompilers.Decompiler.class);

    cachedEnvironment.put(javaProject, this);
  }
    public ApplicationEnvironment(CoreApplicationEnvironment appEnvironment) {
      appEnvironment.registerFileType(HtmlFileType.INSTANCE, "html;htm;sht;shtm;shtml");
      appEnvironment.registerFileType(XHtmlFileType.INSTANCE, "xhtml");
      appEnvironment.registerFileType(DTDFileType.INSTANCE, "dtd;ent;mod;elt");

      appEnvironment.registerFileType(
          XmlFileType.INSTANCE, "xml;xsd;tld;xsl;jnlp;wsdl;jhm;ant;xul;xslt;rng;fxml");

      SyntaxHighlighterFactory.LANGUAGE_FACTORY.addExplicitExtension(
          XMLLanguage.INSTANCE, new XmlSyntaxHighlighterFactory());
      SyntaxHighlighterFactory.LANGUAGE_FACTORY.addExplicitExtension(
          DTDLanguage.INSTANCE, new DtdSyntaxHighlighterFactory());
      SyntaxHighlighterFactory.LANGUAGE_FACTORY.addExplicitExtension(
          HTMLLanguage.INSTANCE, new HtmlSyntaxHighlighterFactory());
      SyntaxHighlighterFactory.LANGUAGE_FACTORY.addExplicitExtension(
          XHTMLLanguage.INSTANCE, new XhtmlSyntaxHighlighterFactory());

      appEnvironment.addExplicitExtension(
          LanguageParserDefinitions.INSTANCE, XMLLanguage.INSTANCE, new XMLParserDefinition());
      appEnvironment.addExplicitExtension(
          LanguageParserDefinitions.INSTANCE, DTDLanguage.INSTANCE, new DTDParserDefinition());
      appEnvironment.addExplicitExtension(
          LanguageParserDefinitions.INSTANCE, HTMLLanguage.INSTANCE, new HTMLParserDefinition());
      appEnvironment.addExplicitExtension(
          LanguageParserDefinitions.INSTANCE, XHTMLLanguage.INSTANCE, new XHTMLParserDefinition());

      appEnvironment.addExplicitExtension(
          IdIndexers.INSTANCE, XmlFileType.INSTANCE, new XmlIdIndexer());
      appEnvironment.addExplicitExtension(
          IdIndexers.INSTANCE, DTDFileType.INSTANCE, new XmlIdIndexer());
      appEnvironment.addExplicitExtension(
          TodoIndexers.INSTANCE, XmlFileType.INSTANCE, new XmlTodoIndexer());
      appEnvironment.addExplicitExtension(
          TodoIndexers.INSTANCE, DTDFileType.INSTANCE, new XmlTodoIndexer());
      appEnvironment.addExplicitExtension(
          TodoIndexers.INSTANCE, XHtmlFileType.INSTANCE, new XHtmlTodoIndexer());

      CoreApplicationEnvironment.registerExtensionPoint(
          Extensions.getRootArea(), ReadWriteAccessDetector.EP_NAME, ReadWriteAccessDetector.class);
      appEnvironment.addExtension(
          ReadWriteAccessDetector.EP_NAME, new XmlReadWriteAccessDetector());

      CoreApplicationEnvironment.registerExtensionPoint(
          Extensions.getRootArea(), XmlFileNSInfoProvider.EP_NAME, XmlFileNSInfoProvider.class);
      appEnvironment.addExtension(XmlFileNSInfoProvider.EP_NAME, new HtmlFileNSInfoProvider());

      CoreApplicationEnvironment.registerExtensionPoint(
          Extensions.getRootArea(),
          StartTagEndTokenProvider.EP_NAME,
          StartTagEndTokenProvider.class);
      CoreApplicationEnvironment.registerExtensionPoint(
          Extensions.getRootArea(), XmlSuppressionProvider.EP_NAME, XmlSuppressionProvider.class);
      CoreApplicationEnvironment.registerExtensionPoint(
          Extensions.getRootArea(), XmlSchemaProvider.EP_NAME, XmlSchemaProvider.class);
      CoreApplicationEnvironment.registerExtensionPoint(
          Extensions.getRootArea(),
          ImplicitNamespaceDescriptorProvider.EP_NAME,
          ImplicitNamespaceDescriptorProvider.class);
      CoreApplicationEnvironment.registerExtensionPoint(
          Extensions.getRootArea(),
          XmlElementDescriptorProvider.EP_NAME,
          XmlElementDescriptorProvider.class);
      CoreApplicationEnvironment.registerExtensionPoint(
          Extensions.getRootArea(), Html5SchemaProvider.EP_NAME, Html5SchemaProvider.class);
      CoreApplicationEnvironment.registerExtensionPoint(
          Extensions.getRootArea(),
          XmlAttributeDescriptorsProvider.EP_NAME,
          XmlAttributeDescriptorsProvider.class);
      CoreApplicationEnvironment.registerExtensionPoint(
          Extensions.getRootArea(), XmlExtension.EP_NAME, XmlExtension.class);
      CoreApplicationEnvironment.registerExtensionPoint(
          Extensions.getRootArea(),
          HtmlEmbeddedTokenTypesProvider.EXTENSION_POINT_NAME,
          HtmlEmbeddedTokenTypesProvider.class);
      CoreApplicationEnvironment.registerExtensionPoint(
          Extensions.getRootArea(),
          StandardResourceProvider.EP_NAME,
          StandardResourceProvider.class);
      CoreApplicationEnvironment.registerExtensionPoint(
          Extensions.getRootArea(), StandardResourceEP.EP_NAME, StandardResourceEP.class);

      appEnvironment.addExtension(MetaDataContributor.EP_NAME, new XmlApplicationComponent());
      appEnvironment.addExtension(
          FileBasedIndexExtension.EXTENSION_POINT_NAME, new XmlNamespaceIndex());
      appEnvironment.addExtension(
          FileBasedIndexExtension.EXTENSION_POINT_NAME, new SchemaTypeInheritanceIndex());
      appEnvironment.addExtension(
          FileBasedIndexExtension.EXTENSION_POINT_NAME, new XmlTagNamesIndex());
      appEnvironment.addExtension(StandardResourceProvider.EP_NAME, new InternalResourceProvider());

      appEnvironment.registerApplicationComponent(PathMacros.class, new PathMacrosImpl());
      appEnvironment.registerApplicationService(
          ExternalResourceManager.class,
          new ExternalResourceManagerExImpl(PathMacrosImpl.getInstanceEx()));
      appEnvironment.registerApplicationService(XmlFoldingSettings.class, new XmlFoldingSettings());
      Language[] myLanguages =
          new Language[] {
            XMLLanguage.INSTANCE,
            HTMLLanguage.INSTANCE,
            XHTMLLanguage.INSTANCE,
            DTDLanguage.INSTANCE
          };
      for (Language myLanguage : myLanguages) {
        appEnvironment.addExplicitExtension(
            LanguageFolding.INSTANCE, myLanguage, new XmlFoldingBuilder());
        appEnvironment.addExplicitExtension(
            LanguageFindUsages.INSTANCE, myLanguage, new XmlFindUsagesProvider());
        appEnvironment.addExplicitExtension(
            LanguageASTFactory.INSTANCE, myLanguage, new XmlASTFactory());
      }
    }