Skip to content

Commit b7767b0

Browse files
authored
Merge pull request #124 from smacker/improve_bblfsh_integration
Improve bblfsh integration
2 parents 8611205 + 11c7e95 commit b7767b0

36 files changed

+4438
-270
lines changed

Gopkg.lock

Lines changed: 12 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Gopkg.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,11 @@
4040

4141
[[constraint]]
4242
name = "gopkg.in/bblfsh/sdk.v1"
43-
version = "1.15.2"
43+
version = "1.16.0"
4444

4545
[[constraint]]
4646
name = "gopkg.in/bblfsh/client-go.v2"
47-
version = "2.4.2"
47+
version = "2.5.1"
4848

4949
[[constraint]]
5050
name = "gopkg.in/DATA-DOG/go-sqlmock.v1"

docs/rest-api.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,3 +286,27 @@ curl -X POST \
286286
}
287287
}
288288
```
289+
290+
## GET /get-languages
291+
292+
Returns programming language supported by bblfsh server.
293+
294+
```bash
295+
curl -X GET http://localhost:8080/get-languages
296+
```
297+
298+
```json
299+
{
300+
"status": 200,
301+
"data": [
302+
{ "id": "python", "name": "Python" },
303+
{ "id": "java", "name": "Java" },
304+
{ "id": "javascript", "name": "JavaScript" },
305+
{ "id": "bash", "name": "Bash" },
306+
{ "id": "ruby", "name": "Ruby" },
307+
{ "id": "go", "name": "Go" },
308+
{ "id": "php", "name": "PHP" }
309+
]
310+
}
311+
312+
```

frontend/package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@
5454
},
5555
"/parse": {
5656
"target": "http://localhost:8080"
57+
},
58+
"/get-languages": {
59+
"target": "http://localhost:8080"
5760
}
5861
}
5962
}

frontend/src/App.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ class App extends Component {
4545
sql: '',
4646
results: new Map(),
4747
schema: undefined,
48+
languages: [],
4849
history: [],
4950
lastResult: null,
5051

@@ -238,7 +239,7 @@ FROM ( SELECT MONTH(committer_when) as month,
238239
this.setState({
239240
showModal: true,
240241
modalTitle: 'Source code',
241-
modalContent: <CodeViewer code={code} />
242+
modalContent: <CodeViewer code={code} languages={this.state.languages} />
242243
});
243244
}
244245

@@ -257,9 +258,20 @@ FROM ( SELECT MONTH(committer_when) as month,
257258
});
258259
}
259260

261+
loadLanguages() {
262+
api
263+
.getLanguages()
264+
.then(languages => this.setState({ languages }))
265+
.catch(err =>
266+
// we don't have UI for this error
267+
console.error(`Can't get list of languages from bblfsh: ${err}`)
268+
);
269+
}
270+
260271
componentDidMount() {
261272
this.setState(loadStateFromStorage());
262273
this.loadSchema();
274+
this.loadLanguages();
263275
this.handleExampleClick(this.exampleQueries[0].sql);
264276
}
265277

frontend/src/api.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,10 +141,15 @@ function parseCode(language, content) {
141141
});
142142
}
143143

144+
function getLanguages() {
145+
return apiCall(`/get-languages`).then(res => res.data);
146+
}
147+
144148
export default {
145149
query,
146150
schema,
147151
queryExport,
148152
detectLang,
149-
parseCode
153+
parseCode,
154+
getLanguages
150155
};

frontend/src/components/CodeViewer.js

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,8 @@ import UASTViewer, { Editor, withUASTEditor } from 'uast-viewer';
55
import api from '../api';
66
import './CodeViewer.less';
77

8-
const avaliableLangs = [
9-
'Java',
10-
'Go',
11-
'Python',
12-
'JavaScript',
13-
'Php',
14-
'Ruby',
15-
'Typescript',
16-
'Bash'
17-
];
18-
198
function EditorPane({
9+
languages,
2010
language,
2111
showUast,
2212
handleLangChange,
@@ -28,9 +18,9 @@ function EditorPane({
2818
Language:{' '}
2919
<select value={language} onChange={handleLangChange}>
3020
<option value="">Select language</option>
31-
{avaliableLangs.map(lang => (
32-
<option key={lang} value={lang.toLowerCase()}>
33-
{lang}
21+
{languages.map(lang => (
22+
<option key={lang.id} value={lang.id}>
23+
{lang.name}
3424
</option>
3525
))}
3626
</select>
@@ -48,6 +38,12 @@ function EditorPane({
4838
}
4939

5040
EditorPane.propTypes = {
41+
languages: PropTypes.arrayOf(
42+
PropTypes.shape({
43+
id: PropTypes.string.isRequired,
44+
name: PropTypes.string.isRequired
45+
})
46+
),
5147
language: PropTypes.string,
5248
showUast: PropTypes.bool,
5349
handleLangChange: PropTypes.func.isRequired,
@@ -56,6 +52,7 @@ EditorPane.propTypes = {
5652
};
5753

5854
function EditorUASTSpitPane({
55+
languages,
5956
editorProps,
6057
uastViewerProps,
6158
showUast,
@@ -65,6 +62,7 @@ function EditorUASTSpitPane({
6562
return (
6663
<SplitPane split="vertical" defaultSize={250} minSize={175}>
6764
<EditorPane
65+
languages={languages}
6866
language={editorProps.languageMode}
6967
showUast={showUast}
7068
handleLangChange={handleLangChange}
@@ -77,6 +75,7 @@ function EditorUASTSpitPane({
7775
}
7876

7977
EditorUASTSpitPane.propTypes = {
78+
languages: EditorPane.propTypes.languages,
8079
editorProps: PropTypes.object,
8180
uastViewerProps: PropTypes.object,
8281
showUast: PropTypes.bool,
@@ -166,6 +165,7 @@ class CodeViewer extends Component {
166165
return (
167166
<div className="code-viewer">
168167
<EditorWithUAST
168+
languages={this.props.languages}
169169
code={this.props.code}
170170
languageMode={language}
171171
showUast={showUast}
@@ -187,6 +187,7 @@ class CodeViewer extends Component {
187187

188188
return (
189189
<EditorPane
190+
languages={this.props.languages}
190191
language={language}
191192
showUast={showUast}
192193
handleLangChange={this.handleLangChange}
@@ -198,7 +199,8 @@ class CodeViewer extends Component {
198199
}
199200

200201
CodeViewer.propTypes = {
201-
code: PropTypes.string.isRequired
202+
code: PropTypes.string.isRequired,
203+
languages: EditorPane.propTypes.languages
202204
};
203205

204206
export default CodeViewer;

server/handler/uast.go

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ package handler
22

33
import (
44
"encoding/json"
5-
"errors"
65
"io/ioutil"
76
"net/http"
7+
"strings"
88

99
bblfsh "gopkg.in/bblfsh/client-go.v2"
1010
"gopkg.in/bblfsh/client-go.v2/tools"
@@ -60,7 +60,7 @@ func Parse(bbblfshServerURL string) RequestProcessFunc {
6060
}
6161

6262
if resp.Status != protocol.Ok {
63-
return nil, errors.New("bblfsh returend not OK response")
63+
return nil, serializer.NewHTTPError(http.StatusBadRequest, strings.Join(resp.Errors, "\n"))
6464
}
6565

6666
if resp.UAST != nil && req.Filter != "" {
@@ -85,3 +85,20 @@ func Filter() RequestProcessFunc {
8585
return nil, serializer.NewHTTPError(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented))
8686
}
8787
}
88+
89+
// GetLanguages returns a list of supported languages by bblfsh
90+
func GetLanguages(bbblfshServerURL string) RequestProcessFunc {
91+
return func(r *http.Request) (*serializer.Response, error) {
92+
cli, err := bblfsh.NewClient(bbblfshServerURL)
93+
if err != nil {
94+
return nil, err
95+
}
96+
97+
resp, err := cli.NewSupportedLanguagesRequest().Do()
98+
if err != nil {
99+
return nil, err
100+
}
101+
102+
return serializer.NewLanguagesResponse(service.DriverManifestsToLangs(resp.Languages)), nil
103+
}
104+
}

server/handler/uast_integration_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,5 +55,5 @@ func (suite *UASTSuite) TestError() {
5555
res := httptest.NewRecorder()
5656
suite.handler.ServeHTTP(res, req)
5757

58-
suite.Equal(http.StatusInternalServerError, res.Code)
58+
suite.Equal(http.StatusBadRequest, res.Code)
5959
}

server/router.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ func Router(
4343
r.Post("/parse", handler.APIHandlerFunc(handler.Parse(bbblfshServerURL)))
4444
r.Post("/filter", handler.APIHandlerFunc(handler.Filter()))
4545
r.Post("/detect-lang", handler.APIHandlerFunc(handler.DetectLanguage()))
46+
r.Get("/get-languages", handler.APIHandlerFunc(handler.GetLanguages(bbblfshServerURL)))
4647

4748
r.Get("/version", handler.APIHandlerFunc(handler.Version(version)))
4849

server/serializer/serializers.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,3 +131,8 @@ func NewDetectLangResponse(lang string, langType enry.Type) *Response {
131131
Type int `json:"type"`
132132
}{lang, int(langType)}, nil)
133133
}
134+
135+
// NewLanguagesResponse returns Response with a list of languages
136+
func NewLanguagesResponse(langs []service.Language) *Response {
137+
return newResponse(langs, nil)
138+
}

server/service/uast.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,3 +73,21 @@ func (n *Node) MarshalJSON() ([]byte, error) {
7373

7474
return json.Marshal(node)
7575
}
76+
77+
type Language struct {
78+
ID string `json:"id"`
79+
Name string `json:"name"`
80+
}
81+
82+
func DriverManifestsToLangs(drivers []protocol.DriverManifest) []Language {
83+
result := make([]Language, len(drivers))
84+
85+
for i, driver := range drivers {
86+
result[i] = Language{
87+
ID: driver.Language,
88+
Name: driver.Name,
89+
}
90+
}
91+
92+
return result
93+
}

vendor/github.com/BurntSushi/toml/COPYING

Lines changed: 14 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/BurntSushi/toml/cmd/toml-test-decoder/COPYING

Lines changed: 14 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/BurntSushi/toml/cmd/toml-test-encoder/COPYING

Lines changed: 14 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/BurntSushi/toml/cmd/tomlv/COPYING

Lines changed: 14 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)