<!DOCTYPE idea-plugin PUBLIC "Plugin/DTD" "http://plugins.intellij.net/plugin.dtd">
<idea-plugin>
  <module-components>
    <component>
      <implementation-class>org.jetbrains.plugins.clojure.config.ClojureFacetListener</implementation-class>
    </component>
  </module-components>

  <name>La Clojure</name>
  <id>org.intellij.clojure</id>
  <description>Provides Clojure language support: syntax and error highlighting, completion, navigation and
    refactorings
  </description>
  <category>Custom Languages</category>
  <version>VERSION</version>
  <vendor url="http://www.jetbrains.com">JetBrains Inc.</vendor>

  <idea-version since-build="143.0" until-build=""/>

  <depends optional="true" config-file="copyright.xml">com.intellij.copyright</depends>

  <extensions defaultExtensionNs="com.intellij">
    <errorHandler implementation="com.intellij.diagnostic.ITNReporter"/>
    <fileTypeFactory implementation="org.jetbrains.plugins.clojure.file.ClojureFileTypeLoader"/>
    <lang.braceMatcher language="Clojure"
                       implementationClass="org.jetbrains.plugins.clojure.highlighter.ClojureBraceMatcher"/>
    <syntaxHighlighter key="Clojure"
                       implementationClass="org.jetbrains.plugins.clojure.highlighter.ClojureSyntaxHighlighter"/>
    <colorSettingsPage implementation="org.jetbrains.plugins.clojure.highlighter.ClojureColorsAndFontsPage"/>
    <lang.commenter language="Clojure"
                    implementationClass="org.jetbrains.plugins.clojure.highlighter.ClojureCommenter"/>
    <lang.parserDefinition language="Clojure"
                           implementationClass="org.jetbrains.plugins.clojure.parser.ClojureParserDefinition"/>
    <lang.foldingBuilder language="Clojure" implementationClass="org.jetbrains.plugins.clojure.ClojureFoldingBuilder"/>
    <lang.psiStructureViewFactory language="Clojure"
                                  implementationClass="org.jetbrains.plugins.clojure.structure.ClojureStructureViewBuilderFactory"/>
    <lang.formatter language="Clojure"
                    implementationClass="org.jetbrains.plugins.clojure.formatter.ClojureFormattingModelBuilder"/>
    <!--<lang.refactoringSupport language="Clojure"-->
    <!--implementationClass="org.jetbrains.plugins.clojure.refactoring.ClojureRefactoringSupportProvider"/>-->
    <codeStyleSettingsProvider
        implementation="org.jetbrains.plugins.clojure.formatter.codeStyle.ClojureCodeStyleSettingsProvider"/>
    <lang.findUsagesProvider language="Clojure"
                             implementationClass="org.jetbrains.plugins.clojure.findUsages.ClojureFindUsagesProvider"/>
    <consoleFilterProvider implementation="org.jetbrains.plugins.clojure.runner.console.ClojureConsoleFilterProvider"/>
    <configurationType implementation="org.jetbrains.plugins.clojure.runner.ClojureScriptRunConfigurationType"/>
    <configurationProducer implementation="org.jetbrains.plugins.clojure.runner.ClojureScriptRunConfigurationProducer"/>
    <fileTemplateGroup implementation="org.jetbrains.plugins.clojure.actions.ClojureTemplatesFactory"/>
    <renameInputValidator
        implementation="org.jetbrains.plugins.clojure.refactoring.rename.ClojureRenameInputValidator"/>
    <fileTypeIndentOptionsProvider
        implementation="org.jetbrains.plugins.clojure.formatter.ClojureIndentOptionsProvider"/>
    <quoteHandler fileType="Clojure" className="org.jetbrains.plugins.clojure.editor.ClojureQuoteHandler"/>
    <annotator language="Clojure"
               implementationClass="org.jetbrains.plugins.clojure.editor.braceHighlighter.ClojureBraceHighlighter"/>
    <annotator language="Clojure" implementationClass="org.jetbrains.plugins.clojure.annotator.ClojureAnnotator"/>
    <debuggerClassFilterProvider
        implementation="org.jetbrains.plugins.clojure.debugger.filters.ClojureDebugClassesFilterProvider"/>
    <gotoSymbolContributor implementation="org.jetbrains.plugins.clojure.gotoclass.ClojureGoToSymbolContributor"/>
    <gotoClassContributor implementation="org.jetbrains.plugins.clojure.gotoclass.ClojureGoToClassContributor"/>
    <xdebugger.settings implementation="org.jetbrains.plugins.clojure.debugger.filters.ClojureDebuggerSettings"/>
    <indexPatternBuilder implementation="org.jetbrains.plugins.clojure.editor.todo.ClojureIndexPatternBuilder"/>
    <java.shortNamesCache implementation="org.jetbrains.plugins.clojure.psi.stubs.ClojureShortNamesCache"/>
    <enterHandlerDelegate implementation="org.jetbrains.plugins.clojure.editor.ClojureEnterHandler" order="first"/>
    <completion.contributor id="clojureClassNameCompletionContributor" language="Clojure"
                            implementationClass="org.jetbrains.plugins.clojure.psi.resolve.completion.ClojureClassNameCompletionContributor"
                            order="first"/>
    <completion.contributor id="clojureCompletionContributor" language="Clojure"
                            implementationClass="org.jetbrains.plugins.clojure.psi.resolve.completion.ClojureCompletionContributor"
                            order="first"/>
    <completion.confidence language="Clojure" 
                           implementationClass="org.jetbrains.plugins.clojure.psi.resolve.completion.ClojureCompletionConfidence" 
                           id="clojure" order="first"/>

    <stubElementTypeHolder class="org.jetbrains.plugins.clojure.parser.ClojureElementTypes"/>

    <stubIndex implementation="org.jetbrains.plugins.clojure.psi.stubs.index.ClDefNameIndex"/>
    <stubIndex implementation="org.jetbrains.plugins.clojure.psi.stubs.index.ClojureNsNameIndex"/>
    <stubIndex implementation="org.jetbrains.plugins.clojure.psi.stubs.index.ClojureKeywordIndex"/>
    <stubIndex implementation="org.jetbrains.plugins.clojure.psi.stubs.index.ClojureClassNameIndex"/>
    <stubIndex implementation="org.jetbrains.plugins.clojure.psi.stubs.index.ClojureFullScriptNameIndex"/>

    <extendWordSelectionHandler implementation="org.jetbrains.plugins.clojure.editor.selection.ClojureListSelectioner"/>
    <extendWordSelectionHandler
        implementation="org.jetbrains.plugins.clojure.editor.selection.ClojureLiteralSelectioner"/>
    <debugger.codeFragmentFactory implementation="org.jetbrains.plugins.clojure.debugger.ClojureCodeFragmentFactory"/>
    <!-- <unscrambleSupport implementation="org.jetbrains.plugins.clojure.debugger.ClojureUnscrambler"/> -->
    <compilerSettingsFactory implementation="org.jetbrains.plugins.clojure.compiler.ClojureCompilerSettingsFactory"/>
    <compileServer.plugin classpath="clojure-jps-plugin.jar"/>
    <frameworkSupport implementation="org.jetbrains.plugins.clojure.config.ClojureFacetSupportProvider"/>
    <applicationService serviceInterface="org.jetbrains.plugins.clojure.settings.ClojureApplicationSettings"
                        serviceImplementation="org.jetbrains.plugins.clojure.settings.ClojureApplicationSettings"/>

    <projectService serviceInterface="org.jetbrains.plugins.clojure.psi.util.ClojurePsiFactory"
                    serviceImplementation="org.jetbrains.plugins.clojure.psi.util.ClojurePsiElementFactoryImpl"/>

    <projectConfigurable implementation="org.jetbrains.plugins.clojure.settings.ClojureConfigurable"/>
    <projectService serviceInterface="org.jetbrains.plugins.clojure.settings.ClojureProjectSettings"
                    serviceImplementation="org.jetbrains.plugins.clojure.settings.ClojureProjectSettings"/>

    <java.elementFinder implementation="org.jetbrains.plugins.clojure.psi.impl.javaView.ClojureClassFinder"/>
    <lang.namesValidator language="Clojure"
                         implementationClass="org.jetbrains.plugins.clojure.refactoring.rename.ClojureNameValidator"/>
    <referencesSearch implementation="org.jetbrains.plugins.clojure.findUsages.ClojureReferenceSearcher"/>
    <lang.documentationProvider language="Clojure"
                                implementationClass="org.jetbrains.plugins.clojure.documentation.ClojureDocumentationProvider"/>
    <renamePsiElementProcessor
        implementation="org.jetbrains.plugins.clojure.refactoring.rename.RenameClojureFileProcessor" order="first"/>
    <debugger.positionManagerFactory
        implementation="org.jetbrains.plugins.clojure.debugger.ClojurePositionManagerFactory"/>

    <stacktrace.fold substring=" clojure.core"/>
    <stacktrace.fold substring=" clojure.lang"/>
    <stacktrace.fold substring=" clojure.main"/>
    <stacktrace.fold substring=" clojure.test"/>

  </extensions>

  <application-components>
    <component>
      <implementation-class>org.jetbrains.plugins.clojure.ClojureLoader</implementation-class>
    </component>
    <component>
      <implementation-class>org.jetbrains.plugins.clojure.config.ClojureFacetLoader</implementation-class>
      <interface-class>org.jetbrains.plugins.clojure.config.ClojureFacetLoader</interface-class>
    </component>
  </application-components>

  <project-components>
    <component>
      <implementation-class>org.jetbrains.plugins.clojure.compiler.ClojureCompilerSettings</implementation-class>
    </component>
    <component>
      <implementation-class>org.jetbrains.plugins.clojure.psi.impl.javaView.ClojureClassFinder
      </implementation-class>
    </component>
    <component>
      <implementation-class>org.jetbrains.plugins.clojure.psi.impl.ClojurePsiManager</implementation-class>
    </component>
  </project-components>

  <actions>
    <!-- Create file actions -->
    <action id="Clojure.ClojureFile" class="org.jetbrains.plugins.clojure.actions.NewClojureFileAction"
            text="Clojure File" description="Create new Clojure File">
      <add-to-group group-id="NewGroup" anchor="before" relative-to-action="NewFromTemplate"/>
    </action>

    <!-- REPL-related actions -->
    <group id="Clojure.REPL.Group"
           class="org.jetbrains.plugins.clojure.repl.actions.ClojureReplActionGroup"
           text="Clojure REPL" description="Clojure" popup="true">

      <action id="org.jetbrains.plugins.clojure.repl.actions.LoadClojureFileInConsoleAction"
              class="org.jetbrains.plugins.clojure.repl.actions.LoadClojureFileInConsoleAction"
              text="Load file to REPL">
        <keyboard-shortcut keymap="$default" first-keystroke="ctrl shift L"/>
      </action>

      <action id="org.jetbrains.plugins.clojure.repl.actions.RunSelectedTextAction"
              class="org.jetbrains.plugins.clojure.repl.actions.RunSelectedTextAction"
              text="Run selected text in REPL">
        <keyboard-shortcut keymap="$default" first-keystroke="ctrl shift K"/>
      </action>

      <action id="org.jetbrains.plugins.clojure.repl.actions.RunLastSExprAction"
              class="org.jetbrains.plugins.clojure.repl.actions.RunLastSExprAction"
              text="Execute last S-expression in REPL">
        <keyboard-shortcut keymap="$default" first-keystroke="ctrl shift H"/>
      </action>

      <action id="org.jetbrains.plugins.clojure.repl.actions.RunTopSExprAction"
              class="org.jetbrains.plugins.clojure.repl.actions.RunTopSExprAction"
              text="Run Top S-expression in REPL">
        <keyboard-shortcut keymap="$default" first-keystroke="ctrl shift G"/>
      </action>

      <action id="org.jetbrains.plugins.clojure.repl.actions.SwitchNamespaceClojureFileInConsoleAction"
              class="org.jetbrains.plugins.clojure.repl.actions.SwitchNamespaceClojureFileInConsoleAction"
              text="Switch to file's namespace in REPL">
      </action>

      <add-to-group group-id="ToolsMenu" anchor="last"/>

    </group>

    <!-- Structural Editing -->

    <group id="ClojureStructuralEditingActionGroup"
           class="org.jetbrains.plugins.clojure.editor.ClojureEditorActionGroup"
           text="Clojure Editor" description="Clojure" popup="true">

      <action id="org.jetbrains.plugins.clojure.actions.editor.BarfBackwardsAction"
              class="org.jetbrains.plugins.clojure.actions.editor.BarfBackwardsAction"
              text="Barf Backwards" description="Spit out the first element in the current s-expression">
        <keyboard-shortcut keymap="$default" first-keystroke="alt shift 9"/>
      </action>

      <action id="org.jetbrains.plugins.clojure.actions.editor.BarfForwardsAction"
              class="org.jetbrains.plugins.clojure.actions.editor.BarfForwardsAction"
              text="Barf Forwards" description="Spit out the last element in the current s-expression">
        <keyboard-shortcut keymap="$default" first-keystroke="alt shift 0"/>
      </action>

      <action id="org.jetbrains.plugins.clojure.actions.editor.SlurpBackwardsAction"
              class="org.jetbrains.plugins.clojure.actions.editor.SlurpBackwardsAction"
              text="Slurp Backwards" description="Swallow the element preceeding the current s-expression">
        <keyboard-shortcut keymap="$default" first-keystroke="ctrl alt shift 9"/>
      </action>

      <action id="org.jetbrains.plugins.clojure.actions.editor.SlurpForwardsAction"
              class="org.jetbrains.plugins.clojure.actions.editor.SlurpForwardsAction"
              text="Slurp Forwards" description="Swallow the element following the current s-expression">
        <keyboard-shortcut keymap="$default" first-keystroke="ctrl alt shift 0"/>
      </action>

      <action id="org.jetbrains.plugins.clojure.actions.editor.SpliceAction"
              class="org.jetbrains.plugins.clojure.actions.editor.SpliceAction"
              text="Splice S-Expression" description="Splice the current s-expression into it’s parent">
        <keyboard-shortcut keymap="$default" first-keystroke="alt meta S"/>
      </action>

      <add-to-group group-id="EditMenu" anchor="last"/>

    </group>

    <action id="org.jetbrains.plugins.clojure.actions.RunClojureConsoleAction"
            class="org.jetbrains.plugins.clojure.actions.RunClojureConsoleAction" text="Start Clojure Console"
            description="Runs Clojure REPL">
      <add-to-group group-id="ToolsMenu" anchor="last"/>
      <add-to-group group-id="RunContextPopupGroup" anchor="last"/>
      <keyboard-shortcut first-keystroke="control shift D" keymap="$default"/>
    </action>

    <action id="Clojure.Console.Execute"
            class="com.intellij.openapi.actionSystem.EmptyAction"
            text="Execute Current Clojure Statement">
      <keyboard-shortcut keymap="$default" first-keystroke="ENTER"/>
    </action>

    <action id="Clojure.Console.Execute.Immediately"
            class="com.intellij.openapi.actionSystem.EmptyAction"
            text="Execute Current Clojure Statement">
      <keyboard-shortcut keymap="$default" first-keystroke="shift ENTER"/>
    </action>

  </actions>


</idea-plugin>
