141 lines
2.6 KiB
GDScript
141 lines
2.6 KiB
GDScript
#*
|
|
#* code_edit.gd
|
|
#* =============================================================================
|
|
#* Copyright 2024 Serhii Snitsaruk
|
|
#*
|
|
#* Use of this source code is governed by an MIT-style
|
|
#* license that can be found in the LICENSE file or at
|
|
#* https://opensource.org/licenses/MIT.
|
|
#* =============================================================================
|
|
#*
|
|
|
|
extends CodeEdit
|
|
|
|
const RESERVED_WORDS := [
|
|
# Control flow.
|
|
"break",
|
|
"continue",
|
|
"elif",
|
|
"else",
|
|
"for",
|
|
"if",
|
|
"match",
|
|
"pass",
|
|
"return",
|
|
"when",
|
|
"while",
|
|
# Declarations.
|
|
"class",
|
|
"class_name",
|
|
"const",
|
|
"enum",
|
|
"extends",
|
|
"func",
|
|
"namespace",
|
|
"signal",
|
|
"static",
|
|
"trait",
|
|
"var",
|
|
# Other keywords.
|
|
"await",
|
|
"breakpoint",
|
|
"self",
|
|
"super",
|
|
"yield",
|
|
# Operators.
|
|
"and",
|
|
"as",
|
|
"in",
|
|
"is",
|
|
"not",
|
|
"or",
|
|
# Special values.
|
|
"false",
|
|
"null",
|
|
"true",
|
|
# Constants.
|
|
"INF",
|
|
"NAN",
|
|
"PI",
|
|
"TAU",
|
|
# Functions.
|
|
"assert",
|
|
"preload",
|
|
]
|
|
|
|
const TYPE_WORDS := [
|
|
"bool",
|
|
"int",
|
|
"float",
|
|
"void",
|
|
"String",
|
|
"Vector2",
|
|
"Vector2i",
|
|
"Rect2",
|
|
"Rect2i",
|
|
"Vector3",
|
|
"Vector3i",
|
|
"Transform2D",
|
|
"Vector4",
|
|
"Vector4i",
|
|
"Plane",
|
|
"Quaternion",
|
|
"AABB",
|
|
"Basis",
|
|
"Transform3D",
|
|
"Projection",
|
|
"Color",
|
|
"StringName",
|
|
"NodePath",
|
|
"RID",
|
|
"Callable",
|
|
"Signal",
|
|
"Dictionary",
|
|
"Array",
|
|
"PackedByteArray",
|
|
"PackedInt32Array",
|
|
"PackedInt64Array",
|
|
"PackedFloat32Array",
|
|
"PackedFloat64Array",
|
|
"PackedStringArray",
|
|
"PackedVector2Array",
|
|
"PackedVector3Array",
|
|
"PackedColorArray",
|
|
# Other types
|
|
"Status",
|
|
]
|
|
|
|
|
|
func _ready() -> void:
|
|
var highlighter := CodeHighlighter.new()
|
|
syntax_highlighter = highlighter
|
|
highlighter.number_color = Color.AQUAMARINE
|
|
highlighter.symbol_color = Color.CORNFLOWER_BLUE
|
|
highlighter.function_color = Color.DEEP_SKY_BLUE
|
|
highlighter.member_variable_color = Color.LIGHT_BLUE
|
|
|
|
# Engine types
|
|
for c in ClassDB.get_class_list():
|
|
syntax_highlighter.add_keyword_color(c, Color.AQUAMARINE)
|
|
|
|
syntax_highlighter.add_color_region("#", "", Color.DIM_GRAY, true)
|
|
syntax_highlighter.add_color_region("@", " ", Color.GOLDENROD)
|
|
syntax_highlighter.add_color_region("\"", "\"", Color.GOLD)
|
|
|
|
for keyword in RESERVED_WORDS:
|
|
syntax_highlighter.add_keyword_color(keyword, Color.INDIAN_RED)
|
|
|
|
for typeword in TYPE_WORDS:
|
|
syntax_highlighter.add_keyword_color(typeword, Color.AQUAMARINE)
|
|
|
|
|
|
func set_source_code(source_code: String) -> void:
|
|
# Hide license header
|
|
var idx: int = source_code.find("#*")
|
|
while idx != - 1:
|
|
source_code = source_code.substr(0, idx) + source_code.substr(source_code.findn("\n", idx) + 1)
|
|
idx = source_code.findn("#*", idx)
|
|
|
|
text = "" # Workaround
|
|
text = source_code
|