Skip to content
This repository has been archived by the owner on Dec 15, 2022. It is now read-only.

Decaffeinate #91

Merged
merged 2 commits into from Oct 19, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
18 changes: 0 additions & 18 deletions lib/autocomplete-snippets.coffee

This file was deleted.

26 changes: 26 additions & 0 deletions lib/autocomplete-snippets.js
@@ -0,0 +1,26 @@
module.exports = {
provider: null,

activate() {},

deactivate() {
this.provider = null
},

provide() {
if (this.provider == null) {
const SnippetsProvider = require('./snippets-provider')
this.provider = new SnippetsProvider()
if (this.snippets != null) {
this.provider.setSnippetsSource(this.snippets)
}
}

return this.provider
},

consumeSnippets(snippets) {
this.snippets = snippets
return (this.provider != null ? this.provider.setSnippetsSource(this.snippets) : undefined)
}
}
52 changes: 0 additions & 52 deletions lib/snippets-provider.coffee

This file was deleted.

62 changes: 62 additions & 0 deletions lib/snippets-provider.js
@@ -0,0 +1,62 @@
module.exports =
class SnippetsProvider {
constructor() {
this.selector = '*'
this.disableForSelector = '.comment, .string'
this.inclusionPriority = 1
this.suggestionPriority = 2
this.filterSuggestions = true

this.showIcon = ['Symbol', 'Subsequence'].includes(atom.config.get('autocomplete-plus.defaultProvider'))
this.snippetsSource = {
snippetsForScopes(scopeDescriptor) {
return atom.config.get('snippets', {scope: scopeDescriptor})
}
}
}

setSnippetsSource(snippetsSource) {
if (typeof (snippetsSource != null ? snippetsSource.snippetsForScopes : undefined) === "function") {
return this.snippetsSource = snippetsSource
}
}

getSuggestions({scopeDescriptor, prefix}) {
if (!(prefix != null ? prefix.length : undefined)) { return }
const scopeSnippets = this.snippetsSource.snippetsForScopes(scopeDescriptor)
return this.findSuggestionsForPrefix(scopeSnippets, prefix)
}

findSuggestionsForPrefix(snippets, prefix) {
if (snippets == null) { return [] }

const suggestions = []
for (let snippetPrefix in snippets) {
const snippet = snippets[snippetPrefix]
if (!snippet || !snippetPrefix || !prefix || !firstCharsEqual(snippetPrefix, prefix)) { continue }
suggestions.push({
iconHTML: this.showIcon ? undefined : false,
type: 'snippet',
text: snippet.prefix,
replacementPrefix: prefix,
rightLabel: snippet.name,
rightLabelHTML: snippet.rightLabelHTML,
leftLabel: snippet.leftLabel,
leftLabelHTML: snippet.leftLabelHTML,
description: snippet.description,
descriptionMoreURL: snippet.descriptionMoreURL
})
}

suggestions.sort(ascendingPrefixComparator)
return suggestions
}

onDidInsertSuggestion({editor}) {
return atom.commands.dispatch(atom.views.getView(editor), 'snippets:expand')
}
}

const ascendingPrefixComparator = (a, b) => a.text.localeCompare(b.text)

const firstCharsEqual = (str1, str2) => str1[0].toLowerCase() === str2[0].toLowerCase()
93 changes: 0 additions & 93 deletions spec/autocomplete-snippets-spec.coffee

This file was deleted.

106 changes: 106 additions & 0 deletions spec/autocomplete-snippets-spec.js
@@ -0,0 +1,106 @@
describe('AutocompleteSnippets', () => {
let [completionDelay, editor, editorView] = []

beforeEach(() => {
atom.config.set('autocomplete-plus.enableAutoActivation', true)
completionDelay = 100
atom.config.set('autocomplete-plus.autoActivationDelay', completionDelay)
completionDelay += 100 // Rendering delay

const workspaceElement = atom.views.getView(atom.workspace)
jasmine.attachToDOM(workspaceElement)

let autocompleteSnippetsMainModule = null
let snippetsMainModule = null
const autocompleteManager = null

waitsForPromise(() =>
Promise.all([
atom.workspace.open('sample.js').then((e) => {
editor = e
editorView = atom.views.getView(editor)
}),

atom.packages.activatePackage('language-javascript'),
atom.packages.activatePackage('autocomplete-snippets').then(({mainModule}) => autocompleteSnippetsMainModule = mainModule),

atom.packages.activatePackage('autocomplete-plus'),
atom.packages.activatePackage('snippets').then(({mainModule}) => {
snippetsMainModule = mainModule
snippetsMainModule.loaded = false
})
])
)

waitsFor('snippets provider to be registered', 1000, () => autocompleteSnippetsMainModule.provider != null)

waitsFor('all snippets to load', 3000, () => snippetsMainModule.loaded)
})

describe('when autocomplete-plus is enabled', () => {
it('shows autocompletions when there are snippets available', () => {
runs(() => {
expect(editorView.querySelector('.autocomplete-plus')).not.toExist()

editor.moveToBottom()
editor.insertText('D')
editor.insertText('o')

advanceClock(completionDelay)
})

waitsFor('autocomplete view to appear', 1000, () => editorView.querySelector('.autocomplete-plus span.word'))

runs(() => {
expect(editorView.querySelector('.autocomplete-plus span.word')).toHaveText('do')
expect(editorView.querySelector('.autocomplete-plus span.right-label')).toHaveText('do')
})
})

it("expands the snippet on confirm", () => {
runs(() => {
expect(editorView.querySelector('.autocomplete-plus')).not.toExist()

editor.moveToBottom()
editor.insertText('D')
editor.insertText('o')

advanceClock(completionDelay)
})

waitsFor('autocomplete view to appear', 1000, () => editorView.querySelector('.autocomplete-plus'))

runs(() => {
atom.commands.dispatch(editorView, 'autocomplete-plus:confirm')
expect(editor.getText()).toContain('} while (true)')
})
})
})

describe('when showing suggestions', () =>
it('sorts them in alphabetical order', () => {
const unorderedPrefixes = [
"",
"dop",
"do",
"dad",
"d"
]

const snippets = {}
for (let x of Array.from(unorderedPrefixes)) {
snippets[x] = {prefix: x, name: "", description: "", descriptionMoreURL: ""}
}

const SnippetsProvider = require('../lib/snippets-provider')
const sp = new SnippetsProvider()
sp.setSnippetsSource({snippetsForScopes(scope) {
return snippets
}})
const suggestions = sp.getSuggestions({scopeDescriptor: "", prefix: "d"})

const suggestionsText = suggestions.map(x => x.text)
expect(suggestionsText).toEqual(["d", "dad", "do", "dop"])
})
)
})