diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml index 6f81984..ff9d201 100644 --- a/.github/workflows/builds.yml +++ b/.github/workflows/builds.yml @@ -107,9 +107,15 @@ jobs: # mvn -B clean install -P dev -Dnetbeans.release.version=RELEASE260 -Dnext.version=RELEASE260 # env: # GITHUB_TOKEN: ${{ github.token }} - - - name: Build with RELEASE270 +# +# - name: Build with RELEASE270 +# run: | +# mvn -B clean install -P dev -Dnetbeans.release.version=RELEASE270 -Dnext.version=RELEASE270 +# env: +# GITHUB_TOKEN: ${{ github.token }} +# + - name: Build with RELEASE280 run: | - mvn -B clean install -P dev -Dnetbeans.release.version=RELEASE270 -Dnext.version=RELEASE270 + mvn -B clean install -P dev -Dnetbeans.release.version=RELEASE280 -Dnext.version=RELEASE280 env: - GITHUB_TOKEN: ${{ github.token }} \ No newline at end of file + GITHUB_TOKEN: ${{ github.token }} diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 0cb87f1..84b7cbc 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -366,10 +366,42 @@ jobs: # asset_content_type: application/gzip # env: # GITHUB_TOKEN: ${{ github.token }} +# +# - name: Build with RELEASE270 +# run: | +# mvn -B clean deploy -Dnetbeans.release.version=RELEASE270 -Dnext.version=${{ env.RELEASE_VERSION }} +# echo "SIZE_20=$(wc -c target/nbm/python-${{ env.RELEASE_VERSION }}.nbm | awk '{print $1}')" >> $GITHUB_ENV +# env: +# MAVEN_USERNAME: ${{ secrets.OSSRH_USERNAME }} +# MAVEN_PASSWORD: ${{ secrets.OSSRH_TOKEN }} +# MAVEN_GPG_PASSPHRASE: ${{ secrets.OSSRH_GPG_SECRET_KEY_PASSWORD }} +# GITHUB_TOKEN: ${{ github.token }} +# +# - name: Create Release +# uses: actions/create-release@v1 +# id: create_release +# with: +# draft: false +# prerelease: false +# release_name: ${{ github.event.repository.name }} RELEASE270 ${{ env.RELEASE_VERSION }} +# tag_name: ${{ env.RELEASE_VERSION }} +# env: +# GITHUB_TOKEN: ${{ github.token }} +# +# - name: Attach RELEASE280 NBM +# uses: actions/upload-release-asset@v1 +# with: +# upload_url: ${{ steps.create_release.outputs.upload_url }} +# asset_path: target/nbm/python-${{ env.RELEASE_VERSION }}.nbm +# asset_name: python-${{ env.RELEASE_VERSION }}.nbm +# asset_content_type: application/gzip +# env: +# GITHUB_TOKEN: ${{ github.token }} + - - name: Build with RELEASE270 + - name: Build with RELEASE280 run: | - mvn -B clean deploy -Dnetbeans.release.version=RELEASE270 -Dnext.version=${{ env.RELEASE_VERSION }} + mvn -B clean deploy -Dnetbeans.release.version=RELEASE280 -Dnext.version=${{ env.RELEASE_VERSION }} echo "SIZE_20=$(wc -c target/nbm/python-${{ env.RELEASE_VERSION }}.nbm | awk '{print $1}')" >> $GITHUB_ENV env: MAVEN_USERNAME: ${{ secrets.OSSRH_USERNAME }} @@ -383,12 +415,12 @@ jobs: with: draft: false prerelease: false - release_name: ${{ github.event.repository.name }} RELEASE270 ${{ env.RELEASE_VERSION }} + release_name: ${{ github.event.repository.name }} RELEASE280 ${{ env.RELEASE_VERSION }} tag_name: ${{ env.RELEASE_VERSION }} env: GITHUB_TOKEN: ${{ github.token }} - - name: Attach RELEASE270 NBM + - name: Attach RELEASE280 NBM uses: actions/upload-release-asset@v1 with: upload_url: ${{ steps.create_release.outputs.upload_url }} diff --git a/pom.xml b/pom.xml index b4c6268..b88be8a 100644 --- a/pom.xml +++ b/pom.xml @@ -811,8 +811,8 @@ target/keystore - RELEASE270 - 1.9.7 + RELEASE280 + 1.9.8 https://github.com/albilu/netbeansPython https://github.com/albilu/netbeansPython.git UTF-8 diff --git a/ppuc/28/updates.xml b/ppuc/28/updates.xml new file mode 100644 index 0000000..d63443c --- /dev/null +++ b/ppuc/28/updates.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/main/java/org/netbeans/modules/python/editor/PythonReformatTask.java b/src/main/java/org/netbeans/modules/python/editor/PythonReformatTask.java index cef8750..79caea1 100644 --- a/src/main/java/org/netbeans/modules/python/editor/PythonReformatTask.java +++ b/src/main/java/org/netbeans/modules/python/editor/PythonReformatTask.java @@ -1,159 +1,159 @@ -package org.netbeans.modules.python.editor; - -/** - * - * @author albilu - */ -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; -import java.util.concurrent.ExecutionException; -import java.util.logging.Level; -import java.util.logging.Logger; -import javax.swing.text.BadLocationException; -import javax.swing.text.Document; -import javax.swing.text.StyledDocument; -import org.apache.commons.lang3.StringUtils; -import org.eclipse.lsp4j.DocumentFormattingParams; -import org.eclipse.lsp4j.DocumentRangeFormattingParams; -import org.eclipse.lsp4j.FormattingOptions; -import org.eclipse.lsp4j.Range; -import org.eclipse.lsp4j.TextDocumentIdentifier; -import org.eclipse.lsp4j.TextEdit; -import org.netbeans.modules.editor.NbEditorUtilities; -import org.netbeans.modules.editor.indent.api.IndentUtils; -import org.netbeans.modules.editor.indent.spi.Context; -import org.netbeans.modules.editor.indent.spi.ExtraLock; -import org.netbeans.modules.lsp.client.LSPBindings; -import org.netbeans.modules.lsp.client.Utils; -import org.netbeans.modules.python.PythonUtility; -import org.openide.filesystems.FileObject; -import org.openide.text.NbDocument; -import org.openide.util.Exceptions; - -public class PythonReformatTask - implements org.netbeans.modules.editor.indent.spi.ReformatTask { - - private final Context context; - - public PythonReformatTask(Context context) { - this.context = context; - } - - @Override - public void reformat() throws BadLocationException { - Document document = context.document(); - boolean rangeOrDoc = context.startOffset() != 0; - FileObject fileObject = NbEditorUtilities.getFileObject(document); - if (fileObject != null && !StringUtils.containsAny(fileObject.getPath(), - PythonUtility.EXCLUDED_DIRS)) { - LSPBindings bindings = LSPBindings.getBindings(fileObject); - if (bindings != null) { - boolean documentFormatting = Utils.isEnabled(bindings - .getInitResult().getCapabilities() - .getDocumentFormattingProvider()); - boolean rangeFormatting = Utils.isEnabled(bindings - .getInitResult().getCapabilities() - .getDocumentRangeFormattingProvider()); - if (rangeFormatting && rangeOrDoc) { - rangeFormat(NbEditorUtilities.getFileObject(document), bindings); - } else if (documentFormatting && !rangeOrDoc) { - documentFormat(NbEditorUtilities.getFileObject(document), bindings); - } - } - } - - } - - private void rangeFormat(FileObject fo, LSPBindings bindings) - throws BadLocationException { - DocumentRangeFormattingParams drfp = new DocumentRangeFormattingParams(); - drfp.setTextDocument(new TextDocumentIdentifier(Utils.toURI(fo))); - drfp.setOptions(new FormattingOptions( - IndentUtils.indentLevelSize(context.document()), - IndentUtils.isExpandTabs(context.document()))); - drfp.setRange(new Range( - Utils.createPosition(context.document(), context.startOffset()), - Utils.createPosition(context.document(), context.endOffset()))); - List edits = new ArrayList<>(); - try { - edits = new ArrayList<>(bindings.getTextDocumentService() - .rangeFormatting(drfp).get()); - } catch (InterruptedException | ExecutionException ex) { - Logger.getLogger(this.getClass().getName()).log(Level.INFO, - String.format("LSP document rangeFormat failed for {0}", fo), - ex); - } - - applyTextEdits(edits); - } - - private void documentFormat(FileObject fo, LSPBindings bindings) - throws BadLocationException { - DocumentFormattingParams dfp = new DocumentFormattingParams(); - dfp.setTextDocument(new TextDocumentIdentifier(Utils.toURI(fo))); - dfp.setOptions(new FormattingOptions( - IndentUtils.indentLevelSize(context.document()), - IndentUtils.isExpandTabs(context.document()))); - List edits = new ArrayList<>(); - try { - edits.addAll(bindings.getTextDocumentService().formatting(dfp).get()); - } catch (InterruptedException | ExecutionException ex) { - Logger.getLogger(this.getClass().getName()).log(Level.INFO, - String.format("LSP document format failed for {0}", fo), - ex); - } - - applyTextEdits(edits); - } - - private void applyTextEdits(List edits) { - if (context.document() instanceof StyledDocument) { - NbDocument.runAtomic((StyledDocument) context.document(), () -> { - applyEditsNoLock(context.document(), edits, context.startOffset(), - context.endOffset()); - }); - } else { - applyEditsNoLock(context.document(), edits, context.startOffset(), - context.endOffset()); - } - } - - public static void applyEditsNoLock(Document doc, List edits, Integer startLimit, Integer endLimit) { - edits - .stream() - .sorted(rangeReverseSort) - .forEach(te -> { - try { - int start = Utils.getOffset(doc, te.getRange().getStart()); - int end = Utils.getOffset(doc, te.getRange().getEnd()); - if ((startLimit == null || start >= startLimit) - && (endLimit == null || end >= 0 || endLimit >= 0)) { - //https://github.com/apache/netbeans/blob/862379894fc239268e55f00bb4ce337d4c4437b8/ide/lsp.client/src/org/netbeans/modules/lsp/client/Utils.java#L182 - doc.remove(start, (end - start < 0 || end - start > endLimit) ? endLimit - start : end - start); - doc.insertString(start, te.getNewText(), null); - } - } catch (BadLocationException ex) { - Exceptions.printStackTrace(ex); - } - }); - } - - private static final Comparator rangeReverseSort = (s1, s2) -> { - int l1 = s1.getRange().getEnd().getLine(); - int l2 = s2.getRange().getEnd().getLine(); - int c1 = s1.getRange().getEnd().getCharacter(); - int c2 = s2.getRange().getEnd().getCharacter(); - if (l1 != l2) { - return l2 - l1; - } else { - return c2 - c1; - } - }; - - @Override - public ExtraLock reformatLock() { - return null; - } - -} +package org.netbeans.modules.python.editor; + +/** + * + * @author albilu + */ +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.concurrent.ExecutionException; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.swing.text.BadLocationException; +import javax.swing.text.Document; +import javax.swing.text.StyledDocument; +import org.apache.commons.lang3.StringUtils; +import org.eclipse.lsp4j.DocumentFormattingParams; +import org.eclipse.lsp4j.DocumentRangeFormattingParams; +import org.eclipse.lsp4j.FormattingOptions; +import org.eclipse.lsp4j.Range; +import org.eclipse.lsp4j.TextDocumentIdentifier; +import org.eclipse.lsp4j.TextEdit; +import org.netbeans.modules.editor.NbEditorUtilities; +import org.netbeans.modules.editor.indent.api.IndentUtils; +import org.netbeans.modules.editor.indent.spi.Context; +import org.netbeans.modules.editor.indent.spi.ExtraLock; +import org.netbeans.modules.lsp.client.LSPBindings; +import org.netbeans.modules.lsp.client.Utils; +import org.netbeans.modules.python.PythonUtility; +import org.openide.filesystems.FileObject; +import org.openide.text.NbDocument; +import org.openide.util.Exceptions; + +public class PythonReformatTask + implements org.netbeans.modules.editor.indent.spi.ReformatTask { + + private final Context context; + + public PythonReformatTask(Context context) { + this.context = context; + } + + @Override + public void reformat() throws BadLocationException { + Document document = context.document(); + boolean rangeOrDoc = context.startOffset() != 0; + FileObject fileObject = NbEditorUtilities.getFileObject(document); + if (fileObject != null && !StringUtils.containsAny(fileObject.getPath(), + PythonUtility.EXCLUDED_DIRS)) { + List bindings = LSPBindings.getBindings(fileObject); + for (LSPBindings binding : bindings) { + boolean documentFormatting = Utils.isEnabled(binding + .getInitResult().getCapabilities() + .getDocumentFormattingProvider()); + boolean rangeFormatting = Utils.isEnabled(binding + .getInitResult().getCapabilities() + .getDocumentRangeFormattingProvider()); + if (rangeFormatting && rangeOrDoc) { + rangeFormat(NbEditorUtilities.getFileObject(document), binding); + } else if (documentFormatting && !rangeOrDoc) { + documentFormat(NbEditorUtilities.getFileObject(document), binding); + } + } + } + + } + + private void rangeFormat(FileObject fo, LSPBindings bindings) + throws BadLocationException { + DocumentRangeFormattingParams drfp = new DocumentRangeFormattingParams(); + drfp.setTextDocument(new TextDocumentIdentifier(Utils.toURI(fo))); + drfp.setOptions(new FormattingOptions( + IndentUtils.indentLevelSize(context.document()), + IndentUtils.isExpandTabs(context.document()))); + drfp.setRange(new Range( + Utils.createPosition(context.document(), context.startOffset()), + Utils.createPosition(context.document(), context.endOffset()))); + List edits = new ArrayList<>(); + try { + edits = new ArrayList<>(bindings.getTextDocumentService() + .rangeFormatting(drfp).get()); + } catch (InterruptedException | ExecutionException ex) { + Logger.getLogger(this.getClass().getName()).log(Level.INFO, + String.format("LSP document rangeFormat failed for {0}", fo), + ex); + } + + applyTextEdits(edits); + } + + private void documentFormat(FileObject fo, LSPBindings bindings) + throws BadLocationException { + DocumentFormattingParams dfp = new DocumentFormattingParams(); + dfp.setTextDocument(new TextDocumentIdentifier(Utils.toURI(fo))); + dfp.setOptions(new FormattingOptions( + IndentUtils.indentLevelSize(context.document()), + IndentUtils.isExpandTabs(context.document()))); + List edits = new ArrayList<>(); + try { + edits.addAll(bindings.getTextDocumentService().formatting(dfp).get()); + } catch (InterruptedException | ExecutionException ex) { + Logger.getLogger(this.getClass().getName()).log(Level.INFO, + String.format("LSP document format failed for {0}", fo), + ex); + } + + applyTextEdits(edits); + } + + private void applyTextEdits(List edits) { + if (context.document() instanceof StyledDocument) { + NbDocument.runAtomic((StyledDocument) context.document(), () -> { + applyEditsNoLock(context.document(), edits, context.startOffset(), + context.endOffset()); + }); + } else { + applyEditsNoLock(context.document(), edits, context.startOffset(), + context.endOffset()); + } + } + + public static void applyEditsNoLock(Document doc, List edits, Integer startLimit, Integer endLimit) { + edits + .stream() + .sorted(rangeReverseSort) + .forEach(te -> { + try { + int start = Utils.getOffset(doc, te.getRange().getStart()); + int end = Utils.getOffset(doc, te.getRange().getEnd()); + if ((startLimit == null || start >= startLimit) + && (endLimit == null || end >= 0 || endLimit >= 0)) { + //https://github.com/apache/netbeans/blob/862379894fc239268e55f00bb4ce337d4c4437b8/ide/lsp.client/src/org/netbeans/modules/lsp/client/Utils.java#L182 + doc.remove(start, (end - start < 0 || end - start > endLimit) ? endLimit - start : end - start); + doc.insertString(start, te.getNewText(), null); + } + } catch (BadLocationException ex) { + Exceptions.printStackTrace(ex); + } + }); + } + + private static final Comparator rangeReverseSort = (s1, s2) -> { + int l1 = s1.getRange().getEnd().getLine(); + int l2 = s2.getRange().getEnd().getLine(); + int c1 = s1.getRange().getEnd().getCharacter(); + int c2 = s2.getRange().getEnd().getCharacter(); + if (l1 != l2) { + return l2 - l1; + } else { + return c2 - c1; + } + }; + + @Override + public ExtraLock reformatLock() { + return null; + } + +} diff --git a/src/main/java/org/netbeans/modules/python/project/PythonProjectOpenedHook.java b/src/main/java/org/netbeans/modules/python/project/PythonProjectOpenedHook.java index 25309b4..ccc84fa 100644 --- a/src/main/java/org/netbeans/modules/python/project/PythonProjectOpenedHook.java +++ b/src/main/java/org/netbeans/modules/python/project/PythonProjectOpenedHook.java @@ -1,86 +1,90 @@ -package org.netbeans.modules.python.project; - -import com.google.common.reflect.TypeToken; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.ToNumberPolicy; -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.util.HashMap; -import java.util.Map; -import org.eclipse.lsp4j.DidChangeConfigurationParams; -import org.netbeans.api.project.Project; -import org.netbeans.api.project.ui.ProjectProblems; -import org.netbeans.modules.lsp.client.LSPBindings; -import org.netbeans.modules.parsing.api.indexing.IndexingManager; -import org.netbeans.modules.python.PythonUtility; -import org.netbeans.spi.project.ui.ProjectOpenedHook; -import org.openide.filesystems.FileObject; -import org.openide.util.Exceptions; -import org.openide.util.Utilities; - -/** - * - * @author albilu - */ -public class PythonProjectOpenedHook extends ProjectOpenedHook { - - private final Project project; - private final FileObject projectDir; - -// private final ClassPath source; - public PythonProjectOpenedHook(Project project) { - this.project = project; - this.projectDir = project.getProjectDirectory(); -// this.source = ClassPathSupport.createClassPath(project.getProjectDirectory()); - } - - @Override - protected void projectOpened() { - PythonUtility.createProperties(project); - IndexingManager.getDefault().refreshIndex(projectDir.toURL(), null, false, true); - try { - String pythonStdLibPath = PythonUtility.getPythonStdLibPath(PythonUtility - .getProjectPythonExe(project.getProjectDirectory())); - File file = new File(pythonStdLibPath); - if (file.exists()) { - IndexingManager.getDefault().refreshIndex(Utilities.toURI(file).toURL(), null, false, false); - } - } catch (IOException ex) { - Exceptions.printStackTrace(ex); - } - - try { - LSPBindings.ensureServerRunning(project, PythonUtility.PYTHON_MIME_TYPE); - Gson create = new GsonBuilder() - .setObjectToNumberStrategy(ToNumberPolicy.BIG_DECIMAL).create(); - Map settings = create - .fromJson(Files.readString( - PythonUtility.SETTINGS.toPath()), - new TypeToken>() { - }.getType()); - if (settings != null) { - Map paramsObject = new HashMap<>(); - settings.remove("auto_pop_completion"); - paramsObject.put("pylsp", settings); - DidChangeConfigurationParams params = new DidChangeConfigurationParams(paramsObject); - LSPBindings.getBindingsImpl(project, projectDir, - PythonUtility.PYTHON_MIME_TYPE).getWorkspaceService() - .didChangeConfiguration(params); - } - } catch (IOException ex) { - Exceptions.printStackTrace(ex); - } -// GlobalPathRegistry.getDefault().register(ClassPath.SOURCE, new ClassPath[]{source}); - if (ProjectProblems.isBroken(project)) { - ProjectProblems.showAlert(project); - } - - } - - @Override - protected void projectClosed() { -// GlobalPathRegistry.getDefault().unregister(ClassPath.SOURCE, new ClassPath[]{source}); - } -} +package org.netbeans.modules.python.project; + +import com.google.common.reflect.TypeToken; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.ToNumberPolicy; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.eclipse.lsp4j.DidChangeConfigurationParams; +import org.netbeans.api.project.Project; +import org.netbeans.api.project.ui.ProjectProblems; +import org.netbeans.modules.lsp.client.LSPBindings; +import org.netbeans.modules.parsing.api.indexing.IndexingManager; +import org.netbeans.modules.python.PythonUtility; +import org.netbeans.spi.project.ui.ProjectOpenedHook; +import org.openide.filesystems.FileObject; +import org.openide.util.Exceptions; +import org.openide.util.Utilities; + +/** + * + * @author albilu + */ +public class PythonProjectOpenedHook extends ProjectOpenedHook { + + private final Project project; + private final FileObject projectDir; + +// private final ClassPath source; + public PythonProjectOpenedHook(Project project) { + this.project = project; + this.projectDir = project.getProjectDirectory(); +// this.source = ClassPathSupport.createClassPath(project.getProjectDirectory()); + } + + @Override + protected void projectOpened() { + PythonUtility.createProperties(project); + IndexingManager.getDefault().refreshIndex(projectDir.toURL(), null, false, true); + try { + String pythonStdLibPath = PythonUtility.getPythonStdLibPath(PythonUtility + .getProjectPythonExe(project.getProjectDirectory())); + File file = new File(pythonStdLibPath); + if (file.exists()) { + IndexingManager.getDefault().refreshIndex(Utilities.toURI(file).toURL(), null, false, false); + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + + try { + LSPBindings.ensureServerRunning(project, PythonUtility.PYTHON_MIME_TYPE); + Gson create = new GsonBuilder() + .setObjectToNumberStrategy(ToNumberPolicy.BIG_DECIMAL).create(); + Map settings = create + .fromJson(Files.readString( + PythonUtility.SETTINGS.toPath()), + new TypeToken>() { + }.getType()); + if (settings != null) { + Map paramsObject = new HashMap<>(); + settings.remove("auto_pop_completion"); + paramsObject.put("pylsp", settings); + DidChangeConfigurationParams params = new DidChangeConfigurationParams(paramsObject); + List bindingsImpl = LSPBindings.getBindingsImpl(project, projectDir, + PythonUtility.PYTHON_MIME_TYPE); + for (LSPBindings lSPBindings : bindingsImpl) { + lSPBindings.getWorkspaceService() + .didChangeConfiguration(params); + } + } + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } +// GlobalPathRegistry.getDefault().register(ClassPath.SOURCE, new ClassPath[]{source}); + if (ProjectProblems.isBroken(project)) { + ProjectProblems.showAlert(project); + } + + } + + @Override + protected void projectClosed() { +// GlobalPathRegistry.getDefault().unregister(ClassPath.SOURCE, new ClassPath[]{source}); + } +}