mirror of
https://github.com/GrahamKracker/UnityExplorer.git
synced 2025-07-01 11:12:49 +08:00
rename Lexer folder to match namespace, some cleanups and color adjustments
This commit is contained in:
@ -1,48 +0,0 @@
|
|||||||
using System.Collections.Generic;
|
|
||||||
using System.Text;
|
|
||||||
using UnityEngine;
|
|
||||||
|
|
||||||
namespace UnityExplorer.UI.CSharpConsole.Lexers
|
|
||||||
{
|
|
||||||
public class KeywordLexer : Lexer
|
|
||||||
{
|
|
||||||
private readonly HashSet<string> keywords = new HashSet<string>
|
|
||||||
{ "add", "as", "ascending", "await", "bool", "break", "by", "byte",
|
|
||||||
"case", "catch", "char", "checked", "const", "continue", "decimal", "default", "descending", "do", "dynamic",
|
|
||||||
"else", "equals", "false", "finally", "float", "for", "foreach", "from", "global", "goto", "group", "if", "in",
|
|
||||||
"int", "into", "is", "join", "let", "lock", "long", "new", "null", "object", "on", "orderby", "out", "ref",
|
|
||||||
"remove", "return", "sbyte", "select", "short", "sizeof", "stackalloc", "string", "switch", "throw", "true",
|
|
||||||
"try", "typeof", "uint", "ulong", "ushort", "var", "where", "while", "yield", "abstract", "async", "base",
|
|
||||||
"class", "delegate", "enum", "explicit", "extern", "fixed", "get", "implicit", "interface", "internal",
|
|
||||||
"namespace", "operator", "override", "params", "private", "protected", "public", "using", "partial", "readonly",
|
|
||||||
"sealed", "set", "static", "struct", "this", "unchecked", "unsafe", "value", "virtual", "volatile", "void" };
|
|
||||||
|
|
||||||
protected override Color HighlightColor => new Color(0.33f, 0.61f, 0.83f, 1.0f);
|
|
||||||
|
|
||||||
public override bool TryMatchCurrent(LexerBuilder lexer)
|
|
||||||
{
|
|
||||||
if (!lexer.IsDelimiter(lexer.Previous, true))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
var sb = new StringBuilder();
|
|
||||||
while (!lexer.EndOfInput)
|
|
||||||
{
|
|
||||||
sb.Append(lexer.Current);
|
|
||||||
var next = lexer.PeekNext();
|
|
||||||
if (lexer.IsDelimiter(next, true))
|
|
||||||
{
|
|
||||||
lexer.RollbackBy(1);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (keywords.Contains(sb.ToString()))
|
|
||||||
{
|
|
||||||
lexer.Commit();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,59 +0,0 @@
|
|||||||
using System.Collections.Generic;
|
|
||||||
using UnityEngine;
|
|
||||||
|
|
||||||
namespace UnityExplorer.UI.CSharpConsole.Lexers
|
|
||||||
{
|
|
||||||
public class StringLexer : Lexer
|
|
||||||
{
|
|
||||||
protected override Color HighlightColor => new Color(0.79f, 0.52f, 0.32f, 1.0f);
|
|
||||||
|
|
||||||
public override IEnumerable<char> Delimiters => new[] { '"' };
|
|
||||||
|
|
||||||
public override bool TryMatchCurrent(LexerBuilder lexer)
|
|
||||||
{
|
|
||||||
if (lexer.Current != '"')
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (lexer.Previous == '@')
|
|
||||||
{
|
|
||||||
// verbatim string, continue until un-escaped quote.
|
|
||||||
while (!lexer.EndOfInput)
|
|
||||||
{
|
|
||||||
lexer.Commit();
|
|
||||||
if (lexer.PeekNext() == '"')
|
|
||||||
{
|
|
||||||
lexer.Commit();
|
|
||||||
// possibly the end, check for escaped quotes.
|
|
||||||
// commit the character and flip the escape bool for each quote.
|
|
||||||
bool escaped = false;
|
|
||||||
while (lexer.PeekNext() == '"')
|
|
||||||
{
|
|
||||||
lexer.Commit();
|
|
||||||
escaped = !escaped;
|
|
||||||
}
|
|
||||||
// if the last quote wasnt escaped, that was the end of the string.
|
|
||||||
if (!escaped)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// normal string
|
|
||||||
// continue until a quote which is not escaped, or end of input
|
|
||||||
|
|
||||||
while (!lexer.EndOfInput)
|
|
||||||
{
|
|
||||||
lexer.Commit();
|
|
||||||
if (lexer.PeekNext() == '"' && lexer.Previous != '\\')
|
|
||||||
{
|
|
||||||
lexer.Commit();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -12,6 +12,7 @@ namespace UnityExplorer.UI.CSharpConsole.Lexers
|
|||||||
Block
|
Block
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// forest green
|
||||||
protected override Color HighlightColor => new Color(0.34f, 0.65f, 0.29f, 1.0f);
|
protected override Color HighlightColor => new Color(0.34f, 0.65f, 0.29f, 1.0f);
|
||||||
|
|
||||||
public override bool TryMatchCurrent(LexerBuilder lexer)
|
public override bool TryMatchCurrent(LexerBuilder lexer)
|
59
src/UI/CSConsole/Lexers/KeywordLexer.cs
Normal file
59
src/UI/CSConsole/Lexers/KeywordLexer.cs
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace UnityExplorer.UI.CSharpConsole.Lexers
|
||||||
|
{
|
||||||
|
public class KeywordLexer : Lexer
|
||||||
|
{
|
||||||
|
// system blue
|
||||||
|
protected override Color HighlightColor => new Color(0.33f, 0.61f, 0.83f, 1.0f);
|
||||||
|
|
||||||
|
private readonly HashSet<string> keywords = new HashSet<string>
|
||||||
|
{
|
||||||
|
// reserved keywords
|
||||||
|
"abstract", "as", "base", "bool", "break", "byte", "case", "catch", "char", "checked", "class", "const", "continue",
|
||||||
|
"decimal", "default", "delegate", "do", "double", "else", "enum", "event", "explicit", "extern", "false", "finally",
|
||||||
|
"fixed", "float", "for", "foreach", "goto", "if", "implicit", "in", "int", "interface", "internal", "is", "lock",
|
||||||
|
"long", "namespace", "new", "null", "object", "operator", "out", "override", "params", "private", "protected", "public",
|
||||||
|
"readonly", "ref", "return", "sbyte", "sealed", "short", "sizeof", "stackalloc", "static", "string", "struct", "switch",
|
||||||
|
"this", "throw", "true", "try", "typeof", "uint", "ulong", "unchecked", "unsafe", "ushort", "using", "virtual", "void",
|
||||||
|
"volatile", "while",
|
||||||
|
// contextual keywords
|
||||||
|
"add", "and", "alias", "ascending", "async", "await", "by", "descending", "dynamic", "equals", "from", "get",
|
||||||
|
"global", "group", "init", "into", "join", "let", "managed", "nameof", "not", "notnull", "on",
|
||||||
|
"or", "orderby", "partial", "record", "remove", "select", "set", "unmanaged", "value", "var", "when", "where",
|
||||||
|
"where", "with", "yield", "nint", "nuint"
|
||||||
|
};
|
||||||
|
|
||||||
|
public override bool TryMatchCurrent(LexerBuilder lexer)
|
||||||
|
{
|
||||||
|
var prev = lexer.Previous;
|
||||||
|
var first = lexer.Current;
|
||||||
|
|
||||||
|
// check for keywords
|
||||||
|
if (lexer.IsDelimiter(prev, true) && char.IsLetter(first))
|
||||||
|
{
|
||||||
|
// can be a keyword...
|
||||||
|
|
||||||
|
var sb = new StringBuilder();
|
||||||
|
sb.Append(lexer.Current);
|
||||||
|
while (!lexer.EndOfInput && char.IsLetter(lexer.PeekNext()))
|
||||||
|
sb.Append(lexer.Current);
|
||||||
|
|
||||||
|
if (keywords.Contains(sb.ToString()))
|
||||||
|
{
|
||||||
|
if (!lexer.EndOfInput)
|
||||||
|
lexer.RollbackBy(1);
|
||||||
|
lexer.Commit();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -4,6 +4,7 @@ namespace UnityExplorer.UI.CSharpConsole.Lexers
|
|||||||
{
|
{
|
||||||
public class NumberLexer : Lexer
|
public class NumberLexer : Lexer
|
||||||
{
|
{
|
||||||
|
// Maroon
|
||||||
protected override Color HighlightColor => new Color(0.58f, 0.33f, 0.33f, 1.0f);
|
protected override Color HighlightColor => new Color(0.58f, 0.33f, 0.33f, 1.0f);
|
||||||
|
|
||||||
private bool IsNumeric(char c) => char.IsNumber(c) || c == '.';
|
private bool IsNumeric(char c) => char.IsNumber(c) || c == '.';
|
80
src/UI/CSConsole/Lexers/StringLexer.cs
Normal file
80
src/UI/CSConsole/Lexers/StringLexer.cs
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace UnityExplorer.UI.CSharpConsole.Lexers
|
||||||
|
{
|
||||||
|
public class StringLexer : Lexer
|
||||||
|
{
|
||||||
|
public override IEnumerable<char> Delimiters => new[] { '"', '\'', };
|
||||||
|
|
||||||
|
// orange
|
||||||
|
protected override Color HighlightColor => new Color(0.79f, 0.52f, 0.32f, 1.0f);
|
||||||
|
|
||||||
|
public override bool TryMatchCurrent(LexerBuilder lexer)
|
||||||
|
{
|
||||||
|
if (lexer.Current == '"')
|
||||||
|
{
|
||||||
|
if (lexer.Previous == '@')
|
||||||
|
{
|
||||||
|
// verbatim string, continue until un-escaped quote.
|
||||||
|
while (!lexer.EndOfInput)
|
||||||
|
{
|
||||||
|
lexer.Commit();
|
||||||
|
if (lexer.PeekNext() == '"')
|
||||||
|
{
|
||||||
|
lexer.Commit();
|
||||||
|
// possibly the end, check for escaped quotes.
|
||||||
|
// commit the character and flip the escape bool for each quote.
|
||||||
|
bool escaped = false;
|
||||||
|
while (lexer.PeekNext() == '"')
|
||||||
|
{
|
||||||
|
lexer.Commit();
|
||||||
|
escaped = !escaped;
|
||||||
|
}
|
||||||
|
// if the last quote wasnt escaped, that was the end of the string.
|
||||||
|
if (!escaped)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// normal string
|
||||||
|
// continue until a quote which is not escaped, or end of input
|
||||||
|
|
||||||
|
while (!lexer.EndOfInput)
|
||||||
|
{
|
||||||
|
lexer.Commit();
|
||||||
|
lexer.PeekNext();
|
||||||
|
if ((lexer.Current == '"') && lexer.Previous != '\\')
|
||||||
|
{
|
||||||
|
lexer.Commit();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else if (lexer.Current == '\'')
|
||||||
|
{
|
||||||
|
// char
|
||||||
|
|
||||||
|
while (!lexer.EndOfInput)
|
||||||
|
{
|
||||||
|
lexer.Commit();
|
||||||
|
lexer.PeekNext();
|
||||||
|
if ((lexer.Current == '\'') && lexer.Previous != '\\')
|
||||||
|
{
|
||||||
|
lexer.Commit();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -7,17 +7,20 @@ namespace UnityExplorer.UI.CSharpConsole.Lexers
|
|||||||
{
|
{
|
||||||
public class SymbolLexer : Lexer
|
public class SymbolLexer : Lexer
|
||||||
{
|
{
|
||||||
protected override Color HighlightColor => Color.white;
|
// silver
|
||||||
|
protected override Color HighlightColor => new Color(0.6f, 0.6f, 0.6f);
|
||||||
|
|
||||||
// all symbols are delimiters
|
// all symbols are delimiters
|
||||||
public override IEnumerable<char> Delimiters => uniqueSymbols;
|
public override IEnumerable<char> Delimiters => symbols;
|
||||||
|
|
||||||
// all symbol combinations are made of valid individual symbols.
|
private readonly HashSet<char> symbols = new HashSet<char>
|
||||||
private readonly HashSet<char> uniqueSymbols = new HashSet<char>
|
|
||||||
{
|
{
|
||||||
'[', ']', '{', '}', '(', ')', ',', '.', ';', ':',
|
'[', '{', '(', // open
|
||||||
'+', '-', '*', '/', '%', '&', '|', '^', '~', '=',
|
']', '}', ')', // close
|
||||||
'<', '>', '?', '!', '@'
|
'.', ',', ';', ':', '?', '@', // special
|
||||||
|
|
||||||
|
// operators
|
||||||
|
'+', '-', '*', '/', '%', '&', '|', '^', '~', '=', '<', '>', '!',
|
||||||
};
|
};
|
||||||
|
|
||||||
public override bool TryMatchCurrent(LexerBuilder lexer)
|
public override bool TryMatchCurrent(LexerBuilder lexer)
|
||||||
@ -26,14 +29,14 @@ namespace UnityExplorer.UI.CSharpConsole.Lexers
|
|||||||
if (!lexer.IsDelimiter(lexer.Previous, true, true))
|
if (!lexer.IsDelimiter(lexer.Previous, true, true))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (uniqueSymbols.Contains(lexer.Current))
|
if (symbols.Contains(lexer.Current))
|
||||||
{
|
{
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
lexer.Commit();
|
lexer.Commit();
|
||||||
lexer.PeekNext();
|
lexer.PeekNext();
|
||||||
}
|
}
|
||||||
while (uniqueSymbols.Contains(lexer.Current));
|
while (symbols.Contains(lexer.Current));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
@ -118,7 +118,7 @@ namespace UnityExplorer.UI.Panels
|
|||||||
|
|
||||||
InputText = Input.InputField.textComponent;
|
InputText = Input.InputField.textComponent;
|
||||||
InputText.supportRichText = false;
|
InputText.supportRichText = false;
|
||||||
InputText.color = new Color(1, 1, 1, 0.65f);
|
InputText.color = Color.white;
|
||||||
Input.PlaceholderText.fontSize = fontSize;
|
Input.PlaceholderText.fontSize = fontSize;
|
||||||
|
|
||||||
// Lexer highlight text overlay
|
// Lexer highlight text overlay
|
||||||
|
@ -25,7 +25,7 @@ namespace UnityExplorer.UI.Widgets.AutoComplete
|
|||||||
public bool AnchorToCaretPosition => false;
|
public bool AnchorToCaretPosition => false;
|
||||||
|
|
||||||
private readonly List<Suggestion> suggestions = new List<Suggestion>();
|
private readonly List<Suggestion> suggestions = new List<Suggestion>();
|
||||||
//private float timeOfLastCheck;
|
private readonly HashSet<string> suggestedNames = new HashSet<string>();
|
||||||
|
|
||||||
private HashSet<Type> allowedTypes;
|
private HashSet<Type> allowedTypes;
|
||||||
|
|
||||||
@ -47,8 +47,6 @@ namespace UnityExplorer.UI.Widgets.AutoComplete
|
|||||||
|
|
||||||
public void OnSuggestionClicked(Suggestion suggestion)
|
public void OnSuggestionClicked(Suggestion suggestion)
|
||||||
{
|
{
|
||||||
//timeOfLastCheck = Time.realtimeSinceStartup;
|
|
||||||
|
|
||||||
InputField.Text = suggestion.UnderlyingValue;
|
InputField.Text = suggestion.UnderlyingValue;
|
||||||
SuggestionClicked?.Invoke(suggestion);
|
SuggestionClicked?.Invoke(suggestion);
|
||||||
|
|
||||||
@ -58,11 +56,6 @@ namespace UnityExplorer.UI.Widgets.AutoComplete
|
|||||||
|
|
||||||
private void OnInputFieldChanged(string value)
|
private void OnInputFieldChanged(string value)
|
||||||
{
|
{
|
||||||
//if (!timeOfLastCheck.OccuredEarlierThanDefault())
|
|
||||||
// return;
|
|
||||||
//
|
|
||||||
//timeOfLastCheck = Time.realtimeSinceStartup;
|
|
||||||
|
|
||||||
value = value ?? "";
|
value = value ?? "";
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(value))
|
if (string.IsNullOrEmpty(value))
|
||||||
@ -81,6 +74,7 @@ namespace UnityExplorer.UI.Widgets.AutoComplete
|
|||||||
private void GetSuggestions(string value)
|
private void GetSuggestions(string value)
|
||||||
{
|
{
|
||||||
suggestions.Clear();
|
suggestions.Clear();
|
||||||
|
suggestedNames.Clear();
|
||||||
|
|
||||||
if (BaseType == null)
|
if (BaseType == null)
|
||||||
{
|
{
|
||||||
@ -101,6 +95,10 @@ namespace UnityExplorer.UI.Widgets.AutoComplete
|
|||||||
|
|
||||||
void AddSuggestion(Type type)
|
void AddSuggestion(Type type)
|
||||||
{
|
{
|
||||||
|
if (suggestedNames.Contains(type.FullName))
|
||||||
|
return;
|
||||||
|
suggestedNames.Add(type.FullName);
|
||||||
|
|
||||||
if (!sharedTypeToLabel.ContainsKey(type.FullName))
|
if (!sharedTypeToLabel.ContainsKey(type.FullName))
|
||||||
sharedTypeToLabel.Add(type.FullName, SignatureHighlighter.Parse(type, true));
|
sharedTypeToLabel.Add(type.FullName, SignatureHighlighter.Parse(type, true));
|
||||||
|
|
||||||
|
@ -220,12 +220,12 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="Core\Config\InternalConfigHandler.cs" />
|
<Compile Include="Core\Config\InternalConfigHandler.cs" />
|
||||||
<Compile Include="UI\CSConsole\LexerBuilder.cs" />
|
<Compile Include="UI\CSConsole\LexerBuilder.cs" />
|
||||||
<Compile Include="UI\CSConsole\Lexer\CommentLexer.cs" />
|
<Compile Include="UI\CSConsole\Lexers\CommentLexer.cs" />
|
||||||
<Compile Include="UI\CSConsole\Lexer\KeywordLexer.cs" />
|
<Compile Include="UI\CSConsole\Lexers\KeywordLexer.cs" />
|
||||||
<Compile Include="UI\CSConsole\Lexer\Lexer.cs" />
|
<Compile Include="UI\CSConsole\Lexers\Lexer.cs" />
|
||||||
<Compile Include="UI\CSConsole\Lexer\NumberLexer.cs" />
|
<Compile Include="UI\CSConsole\Lexers\NumberLexer.cs" />
|
||||||
<Compile Include="UI\CSConsole\Lexer\StringLexer.cs" />
|
<Compile Include="UI\CSConsole\Lexers\StringLexer.cs" />
|
||||||
<Compile Include="UI\CSConsole\Lexer\SymbolLexer.cs" />
|
<Compile Include="UI\CSConsole\Lexers\SymbolLexer.cs" />
|
||||||
<Compile Include="UI\CSConsole\ScriptEvaluator.cs" />
|
<Compile Include="UI\CSConsole\ScriptEvaluator.cs" />
|
||||||
<Compile Include="UI\CSConsole\ScriptInteraction.cs" />
|
<Compile Include="UI\CSConsole\ScriptInteraction.cs" />
|
||||||
<Compile Include="Core\ExplorerBehaviour.cs" />
|
<Compile Include="Core\ExplorerBehaviour.cs" />
|
||||||
|
Reference in New Issue
Block a user