-
-
Save klange/2763edd0e56a3e01b6055dd1f2292bab to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
''' | |
Sample config file for bim3 | |
''' | |
import os | |
# Quirks work the same as they did in bim2, except for the obvious syntax change | |
quirk('TERM','screen','no24bit','noitalic') | |
quirk('TERM','xterm-256color','caninsert','canpaste','cansgrmouse') | |
quirk('TERMINAL_EMULATOR','JetBrains','nobce') | |
# checkprop() returns 0 if we _can_ do something, so | |
# call it with 'not' to check capabilities... | |
if not checkprop('can_unicode'): | |
tabindicator('»') | |
spaceindicator('·') | |
# Themes are actually Kuroko functions now, but we load | |
# them into a table like always for the :theme command | |
theme('sunsmoke') | |
# Non-string values are coerced into strings, so these commands | |
# can take integer values. | |
global.git(1) | |
global.statusbar(1) | |
global.autohidetabs(1) | |
smartcomplete(1) | |
if '/kuroko' in os.getcwd() or '/bim' in os.getcwd(): | |
import syntax.c | |
let krk_types = [ | |
'KrkObj','KrkValue', | |
'KrkClass','KrkString','KrkInstance','krk_integer_type', | |
'KrkList','KrkDict','KrkTuple','KrkClosure','KrkBoundMethod', | |
'KrkCodeObject','KrkToken','KrkChunk','KrkNative', | |
# Compiler stuff | |
'Local','Upvalue','FunctionType','ParseRule', | |
'Compiler','ClassCompiler','Parser', | |
] | |
syntax.c.CHighlighter.types.extend(krk_types) | |
# Old-style macros | |
syntax.c.CHighlighter.keywords.extend(['KRK_METHOD','KRK_FUNC']) | |
# New-style macros | |
syntax.c.CHighlighter.keywords.extend(['KRK_Method','KRK_Function']) | |
if '/bim' in os.getcwd(): | |
import syntax.c | |
syntax.c.CHighlighter.keywords.extend(['BIM_COMMAND','BIM_ACTION']) | |
def doxy(on=True): | |
from syntax.krk import KrkHighlighter | |
from syntax.c import CHighlighter | |
KrkHighlighter.doxygenDocstrings = bool(on) | |
CHighlighter.doxygenDocstrings = bool(on) | |
recalc() | |
from bim import getDocumentText, renderError | |
let cachedCode = None | |
import dis | |
class StaticAnalyzer: | |
_opcodeCache = {} | |
def __init__(self, real, code): | |
self.func = real | |
self.code = code | |
def checkReferences(self): | |
let defined = set() | |
let referenced = set() | |
let references = {} | |
def recursor(func): | |
let instructions = dis.examine(func) | |
let offset = 0 | |
for instruction in instructions: | |
if isinstance(instruction[2],codeobject): | |
recursor(instruction[2]) | |
else if instruction[0] in (dis.OP_DEFINE_GLOBAL,dis.OP_DEFINE_GLOBAL_LONG): | |
defined.add(instruction[2]) | |
else if instruction[0] in (dis.OP_SET_GLOBAL,dis.OP_SET_GLOBAL_LONG,dis.OP_GET_GLOBAL,dis.OP_GET_GLOBAL_LONG): | |
if instruction[2] in referenced: | |
else: | |
referenced.add(instruction[2]) | |
references[instruction[2]] = [func._ip_to_line(offset)] | |
offset += instruction[1] | |
recursor(self.func) | |
let undefined = [(x,references[x]) for x in referenced if x not in defined and x not in dir(__builtins__) and x != '__builtins__'] | |
return undefined | |
@classmethod | |
def fromCode(cls, code): | |
let func | |
try: | |
func = dis.build(code) | |
except SyntaxError as e: | |
return (e.lineno, e.colno, e.arg) | |
return cls(func, code) | |
def check(cls): | |
let code = getDocumentText() | |
if code == cachedCode: return | |
cachedCode = code | |
let result = StaticAnalyzer.fromCode(getDocumentText()) | |
if isinstance(result, tuple): | |
renderError('') | |
renderError(f'\[[0;31mSyntax error on line {result[0]}: {result[2]}') | |
else: | |
let undef = result.checkReferences() | |
if undef: | |
renderError('') | |
renderError(', '.join(str(x) for x in undef)) | |
else: | |
renderError('') | |
try: | |
from syntax.krk import KrkHighlighter | |
if 'doxygenDocstrings' in dir(KrkHighlighter): | |
KrkHighlighter.doxygenDocstrings = True | |
#KrkHighlighter.checkKrkCode = check | |
#KrkHighlighter.enableChecking = True |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment