Skip to content

Enable this module to be used in other versions of NetBeans #24

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
/tmp/rust/
/tmp/rust-sources.zip
/target/
.not-ci
.headless
Expand All @@ -10,3 +12,5 @@
Vagrantfile
/build
/cluster-path
nb-configuration.xml
/nbproject/
4 changes: 4 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
[submodule "externals/rust-grammar"]
path = externals/rust-grammar
url = https://github.com/timboudreau/rust-grammar.git

1 change: 1 addition & 0 deletions externals/rust-grammar
Submodule rust-grammar added at b1bac7
220 changes: 174 additions & 46 deletions pom.xml

Large diffs are not rendered by default.

38 changes: 38 additions & 0 deletions src/main/java/com/github/drrb/rust/netbeans/Installer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
/*
* Copyright (C) 2018 Tim Boudreau
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.github.drrb.rust.netbeans;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import org.netbeans.contrib.yenta.Yenta;

/**
* Allows deployment in multiple versions of NetBeans, with the caveat
* that either of these modules may have broken its ABI in the meantime
* (but in practice, they haven't changed in years).
*
* @author Tim Boudreau
*/
public class Installer extends Yenta {

@Override
protected Set<String> siblings() {
return new HashSet<>(Arrays.asList("org.netbeans.modules.gsf.testrunner", "org.netbeans.modules.gsf.testrunner.ui"));
}

}
34 changes: 23 additions & 11 deletions src/main/java/com/github/drrb/rust/netbeans/RustLanguage.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,24 +17,27 @@
package com.github.drrb.rust.netbeans;

import com.github.drrb.rust.netbeans.formatting.RustFormatter;
import com.github.drrb.rust.netbeans.highlighting.RustSemanticAnalyzer;
import com.github.drrb.rust.netbeans.indexing.RustIndexSearcher;
import com.github.drrb.rust.netbeans.indexing.RustIndexer;
import com.github.drrb.rust.netbeans.parsing.NetbeansRustParser;
import com.github.drrb.rust.netbeans.parsing.RustTokenId;
import com.github.drrb.rust.netbeans.parsing.antlr.AntlrRustLanguageHierarchy;
import com.github.drrb.rust.netbeans.parsing.antlr.AntlrTokenID;
import com.github.drrb.rust.netbeans.parsing.antlr.RustAntlrParser;
import com.github.drrb.rust.netbeans.parsing.antlr.RustAntlrSemanticAnalyzer;
import com.github.drrb.rust.netbeans.parsing.antlr.RustAntlrStructureScanner;
import org.netbeans.api.lexer.Language;
import org.netbeans.modules.csl.api.Formatter;
import org.netbeans.modules.csl.api.IndexSearcher;
import org.netbeans.modules.csl.api.SemanticAnalyzer;
import org.netbeans.modules.csl.spi.DefaultLanguageConfig;
import org.netbeans.modules.csl.spi.LanguageRegistration;
import org.netbeans.modules.parsing.spi.Parser;
import org.netbeans.modules.parsing.spi.indexing.EmbeddingIndexerFactory;
import org.netbeans.modules.parsing.spi.indexing.PathRecognizerRegistration;
import org.openide.util.NbBundle;

import java.util.Collections;
import java.util.Set;
import org.netbeans.modules.csl.api.Formatter;
import org.netbeans.modules.csl.api.IndexSearcher;
import org.netbeans.modules.csl.api.StructureScanner;
import org.netbeans.modules.parsing.spi.indexing.EmbeddingIndexerFactory;

@LanguageRegistration(mimeType = RustLanguage.MIME_TYPE)
@PathRecognizerRegistration(mimeTypes = RustLanguage.MIME_TYPE, sourcePathIds = RustLanguage.SOURCE_CLASSPATH_ID, libraryPathIds = RustLanguage.BOOT_CLASSPATH_ID, binaryLibraryPathIds = {})
Expand Down Expand Up @@ -70,13 +73,13 @@ public boolean isIdentifierChar(char c) {
}

@Override
public Language<RustTokenId> getLexerLanguage() {
return RustTokenId.language();
public Language<AntlrTokenID> getLexerLanguage() {
return AntlrRustLanguageHierarchy.INSTANCE.language();
}

@Override
public Parser getParser() {
return new NetbeansRustParser();
return new RustAntlrParser();
}

@Override
Expand All @@ -91,19 +94,28 @@ public Formatter getFormatter() {

@Override
public SemanticAnalyzer getSemanticAnalyzer() {
return new RustSemanticAnalyzer();
return new RustAntlrSemanticAnalyzer();
}

@Override
public StructureScanner getStructureScanner() {
return new RustAntlrStructureScanner();
}

@Override
public EmbeddingIndexerFactory getIndexerFactory() {
return new RustIndexer.Factory();
}

@Override
public IndexSearcher getIndexSearcher() {
return new RustIndexSearcher();
}

@Override
public boolean hasStructureScanner() {
return true;
}

//TODO: are these required? Is the annotation enough?
@Override
public Set<String> getLibraryPathIds() {
Expand Down
22 changes: 15 additions & 7 deletions src/main/java/com/github/drrb/rust/netbeans/cargo/CargoConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,10 @@
*/
package com.github.drrb.rust.netbeans.cargo;

import com.github.drrb.rust.netbeans.parsing.RustLexUtils;
import com.github.drrb.rust.netbeans.parsing.RustTokenId;
import com.github.drrb.rust.netbeans.parsing.antlr.AntlrRustLexUtils;
import com.github.drrb.rust.netbeans.parsing.antlr.AntlrTokenID;
import static com.github.drrb.rust.netbeans.parsing.antlr.CommonRustTokenIDs.forLiteralName;
import static com.github.drrb.rust.netbeans.parsing.antlr.CommonRustTokenIDs.leftBrace;
import com.github.drrb.rust.netbeans.rustbridge.RustCrateType;
import com.github.drrb.rust.netbeans.util.GsfUtilitiesHack;
import com.github.drrb.rust.netbeans.util.Template;
Expand All @@ -26,7 +28,6 @@
import org.netbeans.api.lexer.TokenSequence;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
import org.openide.text.NbDocument;

import javax.swing.text.Document;
import java.io.FileNotFoundException;
Expand Down Expand Up @@ -69,11 +70,14 @@ private Iterable<? extends FileObject> modFiles(FileObject sourceFile) {

@Override
public void run() {
TokenSequence<RustTokenId> rustTokens = new RustLexUtils().getRustTokenSequence(document, 0);
final AntlrTokenID mod = forLiteralName("mod");
final AntlrTokenID lbrace = leftBrace();
assert mod != null : "'mod' missing from vocabulary";
TokenSequence<?> rustTokens = new AntlrRustLexUtils().getRustTokenSequence(document, 0);
lookingForModDeclarations:
while (rustTokens.moveNext()) {
if (rustTokens.token().id() == RustTokenId.MOD && rustTokens.moveNext()) {
if (rustTokens.moveNext() && rustTokens.token().id() == RustTokenId.LEFT_BRACE) {
if (rustTokens.token().id() == mod && rustTokens.moveNext()) {
if (rustTokens.moveNext() && rustTokens.token().id() == lbrace) {
// It's a mod literal
continue lookingForModDeclarations;
} else {
Expand Down Expand Up @@ -117,7 +121,11 @@ public List<Crate> getCrates() {
String libCratePath = libCrate.getString("path");
if (libCratePath != null) {
FileObject crateFile = baseDir.getFileObject(libCratePath);
List<String> libCrateTypes = new LinkedList<>(libCrate.getList("crate-type"));
List<String> found = libCrate.getList("crate-type");
List<String> libCrateTypes = new LinkedList<>();
if (found != null) {
libCrateTypes.addAll(found);
}
if (libCrateTypes.isEmpty()) {
libCrateTypes.add("rlib");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,8 @@ public void watch(Process process) {
process.destroy();
} finally {
progressHandle.finish();
io.getOut().close();
io.getErr().close();
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,10 @@
*/
package com.github.drrb.rust.netbeans.formatting;

import com.github.drrb.rust.netbeans.parsing.NetbeansRustParser.NetbeansRustParserResult;
import com.github.drrb.rust.netbeans.parsing.RustTokenId;
import com.github.drrb.rust.netbeans.parsing.antlr.AntlrRustLanguageHierarchy;
import com.github.drrb.rust.netbeans.parsing.antlr.AntlrTokenID;
import com.github.drrb.rust.netbeans.parsing.antlr.CommonRustTokenIDs;
import com.github.drrb.rust.netbeans.parsing.antlr.RustAntlrParserResult;
import org.netbeans.api.lexer.Token;
import org.netbeans.api.lexer.TokenHierarchy;
import org.netbeans.api.lexer.TokenSequence;
Expand All @@ -31,18 +33,19 @@
import javax.swing.text.Position;
import java.util.LinkedList;
import java.util.List;
import org.netbeans.api.lexer.Language;

/**
*
*/
public class RustDocumentFormatter {

private final RustFormatter formatter;
private final NetbeansRustParserResult parseResult;
private final RustAntlrParserResult parseResult;
private final BaseDocument document;
private final Context context;

RustDocumentFormatter(RustFormatter formatter, NetbeansRustParserResult parseResult, BaseDocument document, Context context) {
RustDocumentFormatter(RustFormatter formatter, RustAntlrParserResult parseResult, BaseDocument document, Context context) {
this.formatter = formatter;
this.parseResult = parseResult;
this.document = document;
Expand All @@ -51,20 +54,24 @@ public class RustDocumentFormatter {

public void format() {
final Snapshot snapshot = parseResult.getSnapshot();
final Language<AntlrTokenID> language = AntlrRustLanguageHierarchy.INSTANCE.language();
final AntlrTokenID leftBrace = CommonRustTokenIDs.leftBrace();
final AntlrTokenID rightBrace = CommonRustTokenIDs.rightBrace();
final AntlrTokenID semicolon = CommonRustTokenIDs.semicolon();
try {
List<Delimiter> delimiters = new LinkedList<>();
TokenHierarchy<?> tokenHierarchy = snapshot.getTokenHierarchy();
TokenSequence<RustTokenId> tokenSequence = tokenHierarchy.tokenSequence(RustTokenId.language());
TokenSequence<AntlrTokenID> tokenSequence = tokenHierarchy.tokenSequence(language);
tokenSequence.move(0);

while (tokenSequence.moveNext()) {
Token<RustTokenId> token = tokenSequence.token();
Token<AntlrTokenID> token = tokenSequence.token();
int tokenOffset = tokenSequence.offset();
if (token.id() == RustTokenId.LEFT_BRACE) {
if (token.id() == leftBrace) {
delimiters.add(new Delimiter(DelimiterType.OPEN_BRACE, tokenOffset));
} else if (token.id() == RustTokenId.RIGHT_BRACE) {
} else if (token.id() == rightBrace) {
delimiters.add(new Delimiter(DelimiterType.CLOSE_BRACE, tokenOffset));
} else if (token.id() == RustTokenId.SEMICOLON) {
} else if (token.id() == semicolon) {
delimiters.add(new Delimiter(DelimiterType.SEMICOLON, tokenOffset));
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,7 @@
*/
package com.github.drrb.rust.netbeans.formatting;

import com.github.drrb.rust.netbeans.parsing.NetbeansRustParser;
import com.github.drrb.rust.netbeans.parsing.NetbeansRustParser.NetbeansRustParserResult;
import com.github.drrb.rust.netbeans.parsing.antlr.RustAntlrParserResult;
import static java.lang.Character.isWhitespace;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
Expand All @@ -35,7 +34,7 @@ public class RustFormatter implements Formatter {

@Override
public void reformat(Context context, ParserResult compilationInfo) {
NetbeansRustParserResult parseResult = (NetbeansRustParser.NetbeansRustParserResult) compilationInfo;
RustAntlrParserResult parseResult = (RustAntlrParserResult) compilationInfo;
final BaseDocument document = (BaseDocument) context.document();
final RustDocumentFormatter formatter = new RustDocumentFormatter(this, parseResult, document, context);
document.runAtomic(() -> {
Expand Down
Loading