Exemple #1
0
    def palette_declarations(self, view, direct=False):
        def f(res, err):
            if err:
                gs.notice('GsDeclarations', err)
            else:
                decls = res.get('file_decls', [])
                decls.sort(key=lambda v: v.get('row', 0))
                added = 0
                for i, v in enumerate(decls):
                    loc = Loc(v['fn'], v['row'], v['col'])
                    s = '%s %s' % (v['kind'], (v['repr'] or v['name']))
                    self.add_item(s, self.jump_to, (view, loc))
                    added += 1

            if added < 1:
                self.add_item(['', 'No declarations found'])

            self.do_show_panel()

        margo.call(path='/declarations',
                   args={
                       'fn': view.file_name(),
                       'src': view.substr(sublime.Region(0, view.size())),
                   },
                   default={},
                   cb=f,
                   message='fetching file declarations')
Exemple #2
0
	def palette_declarations(self, view, direct=False):
		def f(res, err):
			if err:
				gs.notice('GsDeclarations', err)
			else:
				decls = res.get('file_decls', [])
				decls.sort(key=lambda v: v.get('row', 0))
				added = 0
				for i, v in enumerate(decls):
					loc = Loc(v['fn'], v['row'], v['col'])
					s = '%s %s' % (v['kind'], (v['repr'] or v['name']))
					self.add_item(s, self.jump_to, (view, loc))
					added += 1

			if added < 1:
				self.add_item(['', 'No declarations found'])

			self.do_show_panel()

		margo.call(
			path='/declarations',
			args={
				'fn': view.file_name(),
				'src': view.substr(sublime.Region(0, view.size())),
			},
			default={},
			cb=f,
			message='fetching file declarations'
		)
Exemple #3
0
	def run(self, dir=''):
		if dir == '.':
			self.present_current()
		elif dir:
			self.present('', '', dir)
		else:
			def f(res, err):
				if err:
					gs.notice(DOMAIN, err)
					return

				ents, m = handle_pkgdirs_res(res)
				if ents:
					ents.insert(0, "Current Package")

					def cb(i, win):
						if i == 0:
							self.present_current()
						elif i >= 1:
							self.present('', '', os.path.dirname(m[ents[i]]))

					gs.show_quick_panel(ents, cb)
				else:
					gs.show_quick_panel([['', 'No source directories found']])

			margo.call(
				path='/pkgdirs',
				args={},
				default={},
				cb=f,
				message='fetching pkg dirs'
			)
Exemple #4
0
	def run(self, dir=''):
		if dir == '.':
			self.present_current()
		elif dir:
			self.present('', '', dir)
		else:
			def f(res, err):
				if err:
					gs.notice(DOMAIN, err)
					return

				ents, m = handle_pkgdirs_res(res)
				if ents:
					ents.insert(0, "Current Package")

					def cb(i, win):
						if i == 0:
							self.present_current()
						elif i >= 1:
							self.present('', '', os.path.dirname(m[ents[i]]))

					gs.show_quick_panel(ents, cb)
				else:
					gs.show_quick_panel([['', 'No source directories found']])

			margo.call(
				path='/pkgdirs',
				args={},
				default={},
				cb=f,
				message='fetching pkg dirs'
			)
Exemple #5
0
	def run(self, _, mode=''):
		view = self.view
		if (not gs.is_go_source_view(view)) or (mode not in ['goto', 'hint']):
			return

		pt = gs.sel(view).begin()
		src = view.substr(sublime.Region(0, view.size()))
		def f(docs, err):
			doc = ''
			if err:
				self.show_output('// Error: %s' % err)
			elif docs:
				if mode == "goto":
					fn = ''
					flags = 0
					if len(docs) > 0:
						d = docs[0]
						fn = d.get('fn', '')
						row = d.get('row', 0)
						col = d.get('col', 0)
						if fn:
							gs.println('opening %s:%s:%s' % (fn, row, col))
							gs.focus(fn, row, col)
							return
					self.show_output("%s: cannot find definition" % DOMAIN)
				elif mode == "hint":
					s = []
					for d in docs:
						name = d.get('name', '')
						if name:
							kind = d.get('kind', '')
							pkg = d.get('pkg', '')
							if pkg:
								name = '%s.%s' % (pkg, name)
							src = d.get('src', '')
							if src:
								src = '\n//\n%s' % src
							doc = '// %s %s%s' % (name, kind, src)

						s.append(doc)
					doc = '\n\n\n'.join(s).strip()
			self.show_output(doc or "// %s: no docs found" % DOMAIN)

		margo.call(
			path='/doc',
			args={
				'fn': view.file_name(),
				'src': src,
				'offset': pt,
			},
			default=[],
			cb=f,
			message='fetching docs'
		)
Exemple #6
0
	def run(self, _, mode=''):
		view = self.view
		if (not gs.is_go_source_view(view)) or (mode not in ['goto', 'hint']):
			return

		pt = view.sel()[0].begin()
		src = view.substr(sublime.Region(0, view.size()))
		def f(docs, err):
			doc = ''
			if err:
				self.show_output('// Error: %s' % err)
			elif docs:
				if mode == "goto":
					fn = ''
					flags = 0
					if len(docs) > 0:
						d = docs[0]
						fn = d.get('fn', '')
						row = d.get('row', 0)
						col = d.get('col', 0)
						if fn:
							gs.println('opening %s:%s:%s' % (fn, row, col))
							gs.focus(fn, row, col)
							return
					self.show_output("%s: cannot find definition" % DOMAIN)
				elif mode == "hint":
					s = []
					for d in docs:
						name = d.get('name', '')
						if name:
							kind = d.get('kind', '')
							pkg = d.get('pkg', '')
							if pkg:
								name = '%s.%s' % (pkg, name)
							src = d.get('src', '')
							if src:
								src = '\n//\n%s' % src
							doc = '// %s %s%s' % (name, kind, src)

						s.append(doc)
					doc = '\n\n\n'.join(s).strip()
			self.show_output(doc or "// %s: no docs found" % DOMAIN)

		margo.call(
			path='/doc',
			args={
				'fn': view.file_name(),
				'src': src,
				'offset': pt,
			},
			default=[],
			cb=f,
			message='fetching docs'
		)
Exemple #7
0
	def present(self, vfn, src, pkg_dir):
		win = self.window
		if win is None:
			return

		def f(res, err):
			if err:
				gs.notice(DOMAIN, err)
				return

			decls = res.get('file_decls', [])
			for d in res.get('pkg_decls', []):
				if not vfn or d['fn'] != vfn:
					decls.append(d)

			for d in decls:
				dname = (d['repr'] or d['name'])
				trailer = []
				trailer.extend(GOOS_PAT.findall(d['fn']))
				trailer.extend(GOARCH_PAT.findall(d['fn']))
				if trailer:
					trailer = ' (%s)' % ', '.join(trailer)
				else:
					trailer = ''
				d['ent'] = '%s %s%s' % (d['kind'], dname, trailer)

			ents = []
			decls.sort(key=lambda d: d['ent'])
			for d in decls:
				ents.append(d['ent'])

			def cb(i):
				if i >= 0:
					d = decls[i]
					gs.focus(d['fn'], d['row'], d['col'], win)

			if ents:
				win.show_quick_panel(ents, cb)
			else:
				win.show_quick_panel([['', 'No declarations found']], lambda x: None)

		margo.call(
			path='/declarations',
			args={
				'fn': vfn,
				'src': src,
				'pkg_dir': pkg_dir,
			},
			default={},
			cb=f,
			message='fetching pkg declarations'
		)
Exemple #8
0
	def present(self, vfn, src, pkg_dir):
		win = self.window
		if win is None:
			return

		def f(res, err):
			if err:
				gs.notice(DOMAIN, err)
				return

			decls = res.get('file_decls', [])
			for d in res.get('pkg_decls', []):
				if not vfn or d['fn'] != vfn:
					decls.append(d)

			for d in decls:
				dname = (d['repr'] or d['name'])
				trailer = []
				trailer.extend(GOOS_PAT.findall(d['fn']))
				trailer.extend(GOARCH_PAT.findall(d['fn']))
				if trailer:
					trailer = ' (%s)' % ', '.join(trailer)
				else:
					trailer = ''
				d['ent'] = '%s %s%s' % (d['kind'], dname, trailer)

			ents = []
			decls.sort(key=lambda d: d['ent'])
			for d in decls:
				ents.append(d['ent'])

			def cb(i):
				if i >= 0:
					d = decls[i]
					gs.focus(d['fn'], d['row'], d['col'], win)

			if ents:
				win.show_quick_panel(ents, cb)
			else:
				win.show_quick_panel([['', 'No declarations found']], lambda x: None)

		margo.call(
			path='/declarations',
			args={
				'fn': vfn,
				'src': src,
				'pkg_dir': pkg_dir,
			},
			default={},
			cb=f,
			message='fetching pkg declarations'
		)
Exemple #9
0
    def run(self, _, mode=""):
        view = self.view
        if (not gs.is_go_source_view(view)) or (mode not in ["goto", "hint"]):
            return

        pt = gs.sel(view).begin()
        src = view.substr(sublime.Region(0, view.size()))

        def f(docs, err):
            doc = ""
            if err:
                self.show_output("// Error: %s" % err)
            elif docs:
                if mode == "goto":
                    fn = ""
                    flags = 0
                    if len(docs) > 0:
                        d = docs[0]
                        fn = d.get("fn", "")
                        row = d.get("row", 0)
                        col = d.get("col", 0)
                        if fn:
                            gs.println("opening %s:%s:%s" % (fn, row, col))
                            gs.focus(fn, row, col)
                            return
                    self.show_output("%s: cannot find definition" % DOMAIN)
                elif mode == "hint":
                    s = []
                    for d in docs:
                        name = d.get("name", "")
                        if name:
                            kind = d.get("kind", "")
                            pkg = d.get("pkg", "")
                            if pkg:
                                name = "%s.%s" % (pkg, name)
                            src = d.get("src", "")
                            if src:
                                src = "\n//\n%s" % src
                            doc = "// %s %s%s" % (name, kind, src)

                        s.append(doc)
                    doc = "\n\n\n".join(s).strip()
            self.show_output(doc or "// %s: no docs found" % DOMAIN)

        margo.call(
            path="/doc",
            args={"fn": view.file_name(), "src": src, "offset": pt},
            default=[],
            cb=f,
            message="fetching docs",
        )
Exemple #10
0
    def palette_imports(self, view, direct=False):
        indent = '' if direct else '    '
        src = view.substr(sublime.Region(0, view.size()))

        def f(im, err):
            if err:
                gs.notice(DOMAIN, err)
                return

            delete_imports = []
            add_imports = []
            for path in im.get('paths', []):
                skipAdd = False
                for i in im.get('imports', []):
                    if i.get('path') == path:
                        skipAdd = True
                        name = i.get('name', '')
                        if not name:
                            name = basename(path)
                        if name == path:
                            delete_imports.append(
                                ('%sdelete: %s' % (indent, name), i))
                        else:
                            delete_imports.append(
                                ('%sdelete: %s ( %s )' % (indent, name, path),
                                 i))

                if not skipAdd:
                    add_imports.append(('%s%s' % (indent, path), {
                        'path': path,
                        'add': True
                    }))
            for i in sorted(delete_imports):
                self.add_item(i[0], self.toggle_import, (view, i[1]))
            if len(delete_imports) > 0:
                self.add_item(' ', self.show_palette, 'imports')
            for i in sorted(add_imports):
                self.add_item(i[0], self.toggle_import, (view, i[1]))

            self.do_show_panel()

        margo.call(path='/import_paths',
                   args={
                       'fn': view.file_name(),
                       'src': src,
                   },
                   cb=f,
                   message='fetching pkg import paths')
Exemple #11
0
    def present(self, vfn, src, pkg_dir):
        win = self.window
        if win is None:
            return

        def f(res, err):
            if err:
                gs.notice(DOMAIN, err)
                return

            decls = res.get("file_decls", [])
            for d in res.get("pkg_decls", []):
                if not vfn or d["fn"] != vfn:
                    decls.append(d)

            for d in decls:
                dname = d["repr"] or d["name"]
                trailer = []
                trailer.extend(GOOS_PAT.findall(d["fn"]))
                trailer.extend(GOARCH_PAT.findall(d["fn"]))
                if trailer:
                    trailer = " (%s)" % ", ".join(trailer)
                else:
                    trailer = ""
                d["ent"] = "%s %s%s" % (d["kind"], dname, trailer)

            ents = []
            decls.sort(key=lambda d: d["ent"])
            for d in decls:
                ents.append(d["ent"])

            def cb(i):
                if i >= 0:
                    d = decls[i]
                    gs.focus(d["fn"], d["row"], d["col"], win)

            if ents:
                win.show_quick_panel(ents, cb)
            else:
                win.show_quick_panel([["", "No declarations found"]], lambda x: None)

        margo.call(
            path="/declarations",
            args={"fn": vfn, "src": src, "pkg_dir": pkg_dir},
            default={},
            cb=f,
            message="fetching pkg declarations",
        )
Exemple #12
0
	def palette_imports(self, view, direct=False):
		indent = '' if direct else '    '
		src = view.substr(sublime.Region(0, view.size()))
		def f(im, err):
			if err:
				gs.notice(DOMAIN, err)
				return

			delete_imports = []
			add_imports = []
			for path in im.get('paths', []):
				skipAdd = False
				for i in im.get('imports', []):
					if i.get('path') == path:
						skipAdd = True
						name = i.get('name', '')
						if not name:
							name = basename(path)
						if name == path:
							delete_imports.append(('%sdelete: %s' % (indent, name), i))
						else:
							delete_imports.append(('%sdelete: %s ( %s )' % (indent, name, path), i))

				if not skipAdd:
					add_imports.append(('%s%s' % (indent, path), {'path': path, 'add': True}))
			for i in sorted(delete_imports):
				self.add_item(i[0], self.toggle_import, (view, i[1]))
			if len(delete_imports) > 0:
				self.add_item(' ', self.show_palette, 'imports')
			for i in sorted(add_imports):
				self.add_item(i[0], self.toggle_import, (view, i[1]))

			self.do_show_panel()

		margo.call(
			path='/import_paths',
			args={
				'fn': view.file_name(),
				'src': src,
			},
			cb=f,
			message='fetching pkg import paths'
		)
Exemple #13
0
    def run(self):
        def f(res, err):
            if err:
                gs.notice(DOMAIN, err)
                return

            ents, m = handle_pkgdirs_res(res)
            if ents:

                def cb(i, win):
                    if i >= 0:
                        dirname = gs.basedir_or_cwd(m[ents[i]])
                        win.run_command("gs_browse_files", {"dir": dirname})

                gs.show_quick_panel(ents, cb)
            else:
                gs.show_quick_panel([["", "No source directories found"]])

        margo.call(path="/pkgdirs", args={}, default={}, cb=f, message="fetching pkg dirs")
Exemple #14
0
def check_depends():
	changelog_fn = gs.dist_path("CHANGELOG.md")
	try:
		with open(changelog_fn) as f:
			s = f.read()
	except IOError:
		gs.notice(DOMAIN, traceback.format_exc())
		return

	changes = split_changes(s)
	if changes:
		def cb():
			aso = gs.aso()
			old_rev = aso.get('changelog.rev', '')
			new_rev = changes[0][0]
			if new_rev > old_rev:
				aso.set('changelog.rev', new_rev)
				gs.save_aso()

				new_changes = [
					'GoSublime: Recent Updates (you may need to restart Sublime Text for changes to take effect)',
					'------------------------------------------------------------------------------------------',
				]

				for change in changes:
					rev, msg = change
					if rev > old_rev:
						new_changes.append('\n%s\n\t%s' % (rev, msg))
					else:
						break

				new_changes.append('\nSee %s for the full CHANGELOG\n' % changelog_fn)
				new_changes = '\n'.join(new_changes)
				gs.show_output(DOMAIN, new_changes, print_output=False)
		sublime.set_timeout(cb, 0)
	else:
		margo.call(
			path='/',
			args='hello',
			message='hello MarGo'
		)
Exemple #15
0
	def run(self):
		def f(res, err):
			if err:
				gs.notice(DOMAIN, err)
				return

			ents, m = handle_pkgdirs_res(res)
			if ents:
				def cb(i, win):
					if i >= 0:
						dirname = gs.basedir_or_cwd(m[ents[i]])
						win.run_command('gs_browse_files', {'dir': dirname})
				gs.show_quick_panel(ents, cb)
			else:
				gs.show_quick_panel([['', 'No source directories found']])

		margo.call(
			path='/pkgdirs',
			args={},
			default={},
			cb=f,
			message='fetching pkg dirs'
		)
Exemple #16
0
def check_depends():
	gr = gs.go_env_goroot()
	if not gr:
		gs.notice(DOMAIN, 'The `go` command cannot be found')
		return

	e = gs.env()
	if not e.get('GOROOT'):
		os.environ['GOROOT'] = gr
	elif not e.get('GOPATH'):
		gs.notice(DOMAIN, "GOPATH and/or GOROOT appear to be unset")

	gs.println(
		'GoSublime: checking dependencies',
		('\tGOROOT is: %s' % e.get('GOROOT', gr)),
		('\tGOPATH is: %s' % e.get('GOPATH', ''))
	)

	missing = []
	for cmd in ('gocode', 'MarGo'):
		if not call_cmd([cmd, '--help']):
			missing.append(cmd)

	if missing:
		def cb(i, _):
			if i == 0:
				run_go_get()

		items = [[
			'GoSublime depends on gocode and MarGo',
			'Install %s (using `go get`)' % ', '.join(missing),
			'gocode repo: %s' % GOCODE_REPO,
			'MarGo repo: %s' % MARGO_REPO,
		]]

		gs.show_quick_panel(items, cb)
		gs.println(DOMAIN, '\n'.join(items[0]))
		return

	changelog_fn = os.path.join(sublime.packages_path(), 'GoSublime', "CHANGELOG.md")
	try:
		with open(changelog_fn) as f:
			s = f.read()
	except IOError:
		gs.notice(DOMAIN, traceback.format_exc())
		return

	changes = split_changes(s)
	if changes:
		def cb():
			settings_fn = 'GoSublime-GsDepends.sublime-settings'
			settings = sublime.load_settings(settings_fn)
			new_rev = changes[-1][0]
			old_rev = settings.get('tracking_rev', '')

			def on_panel_close(i, win):
				if i > 0:
					settings.set('tracking_rev', new_rev)
					sublime.save_settings(settings_fn)
					win.open_file(changelog_fn)
					if i == 1:
						run_go_get()

			if new_rev > old_rev:
				items = [
					[
						" ",
						"GoSublime updated to %s" % new_rev,
						" ",
					],
					[
						"Install/Update dependencies: Gocode, MarGo",
						"go get -u %s" % GOCODE_REPO,
						"go get -u %s" % MARGO_REPO,
					],
					[
						"View changelog",
						"Packages/GoSublime/CHANGELOG.md"
						" ",
					]
				]
				gs.show_quick_panel(items, on_panel_close)
		sublime.set_timeout(cb, 0)
	else:
		margo.call(
			path='/',
			args='hello',
			message='hello MarGo'
		)