From 05e4198ab47f4fb195768b9aef64e6cc3c0d6fba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=BE=D0=BD=D0=B4=D0=B0=D1=80=D0=B5=D0=B2=20=D0=98?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD?= Date: Sun, 23 Jun 2019 12:47:20 +0200 Subject: [PATCH] fix pascalabcnet/pascalabcnetide#124 --- CodeCompletion/DomConverter.cs | 15 ++++++ CodeCompletion/ExpressionEvaluator.cs | 48 +++++++++---------- TestSuite/intellisense_tests/stringconst1.pas | 17 +++++++ 3 files changed, 56 insertions(+), 24 deletions(-) create mode 100644 TestSuite/intellisense_tests/stringconst1.pas diff --git a/CodeCompletion/DomConverter.cs b/CodeCompletion/DomConverter.cs index 7b7a129eb..14308499a 100644 --- a/CodeCompletion/DomConverter.cs +++ b/CodeCompletion/DomConverter.cs @@ -17,6 +17,21 @@ namespace CodeCompletion public struct RetValue { public object prim_val; + + public string string_val + { + get + { + string s = (string)prim_val; + if (s != null && s.StartsWith("'") && s.EndsWith("'")) + s = s.Substring(1, s.Length - 2); + return s; + } + set + { + prim_val = "'" + value + "'"; + } + } } public class DomConverter : ICodeCompletionDomConverter diff --git a/CodeCompletion/ExpressionEvaluator.cs b/CodeCompletion/ExpressionEvaluator.cs index 6ffa10ce6..ff60472b7 100644 --- a/CodeCompletion/ExpressionEvaluator.cs +++ b/CodeCompletion/ExpressionEvaluator.cs @@ -37,7 +37,7 @@ namespace CodeCompletion case TypeCode.Int32 : res.prim_val = (int)left.prim_val + (int)right.prim_val; break; case TypeCode.Double : res.prim_val = (int)left.prim_val + (double)right.prim_val; break; case TypeCode.Int64 : res.prim_val = (int)left.prim_val + (long)right.prim_val; break; - case TypeCode.String : res.prim_val = ((int)left.prim_val).ToString() + (string)right.prim_val; break; + case TypeCode.String : res.string_val = ((int)left.prim_val).ToString() + right.string_val; break; case TypeCode.Int16 : res.prim_val = (int)left.prim_val + (System.Int16)right.prim_val; break; case TypeCode.SByte : res.prim_val = (int)left.prim_val + (sbyte)right.prim_val; break; case TypeCode.UInt16 : res.prim_val = (int)left.prim_val + (System.UInt16)right.prim_val; break; @@ -55,7 +55,7 @@ namespace CodeCompletion case TypeCode.Int32 : res.prim_val = (double)left.prim_val + (int)right.prim_val; break; case TypeCode.Double : res.prim_val = (double)left.prim_val + (double)right.prim_val; break; case TypeCode.Int64 : res.prim_val = (double)left.prim_val + (long)right.prim_val; break; - case TypeCode.String : res.prim_val = ((double)left.prim_val).ToString() + (string)right.prim_val; break; + case TypeCode.String : res.string_val = ((double)left.prim_val).ToString() + right.string_val; break; case TypeCode.Int16 : res.prim_val = (double)left.prim_val + (System.Int16)right.prim_val; break; case TypeCode.SByte : res.prim_val = (double)left.prim_val + (sbyte)right.prim_val; break; case TypeCode.UInt16 : res.prim_val = (double)left.prim_val + (System.UInt16)right.prim_val; break; @@ -73,7 +73,7 @@ namespace CodeCompletion case TypeCode.Int32 : res.prim_val = (byte)left.prim_val + (int)right.prim_val; break; case TypeCode.Double : res.prim_val = (byte)left.prim_val + (double)right.prim_val; break; case TypeCode.Int64 : res.prim_val = (byte)left.prim_val + (long)right.prim_val; break; - case TypeCode.String : res.prim_val = ((byte)left.prim_val).ToString() + (string)right.prim_val; break; + case TypeCode.String : res.string_val = ((byte)left.prim_val).ToString() + right.string_val; break; case TypeCode.Int16 : res.prim_val = (byte)left.prim_val + (System.Int16)right.prim_val; break; case TypeCode.SByte : res.prim_val = (byte)left.prim_val + (sbyte)right.prim_val; break; case TypeCode.UInt16 : res.prim_val = (byte)left.prim_val + (System.UInt16)right.prim_val; break; @@ -91,7 +91,7 @@ namespace CodeCompletion case TypeCode.Int32 : res.prim_val = (System.Int16)left.prim_val + (int)right.prim_val; break; case TypeCode.Double : res.prim_val = (System.Int16)left.prim_val + (double)right.prim_val; break; case TypeCode.Int64 : res.prim_val = (System.Int16)left.prim_val + (long)right.prim_val; break; - case TypeCode.String : res.prim_val = ((System.Int16)left.prim_val).ToString() + (string)right.prim_val; break; + case TypeCode.String : res.string_val = ((System.Int16)left.prim_val).ToString() + right.string_val; break; case TypeCode.Int16 : res.prim_val = (System.Int16)left.prim_val + (System.Int16)right.prim_val; break; case TypeCode.SByte : res.prim_val = (System.Int16)left.prim_val + (sbyte)right.prim_val; break; case TypeCode.UInt16 : res.prim_val = (System.Int16)left.prim_val + (System.UInt16)right.prim_val; break; @@ -109,7 +109,7 @@ namespace CodeCompletion case TypeCode.Int32 : res.prim_val = (System.Int64)left.prim_val + (int)right.prim_val; break; case TypeCode.Double : res.prim_val = (System.Int64)left.prim_val + (double)right.prim_val; break; case TypeCode.Int64 : res.prim_val = (System.Int64)left.prim_val + (long)right.prim_val; break; - case TypeCode.String : res.prim_val = ((System.Int64)left.prim_val).ToString() + (string)right.prim_val; break; + case TypeCode.String : res.string_val = ((System.Int64)left.prim_val).ToString() + right.string_val; break; case TypeCode.Int16 : res.prim_val = (System.Int64)left.prim_val + (System.Int16)right.prim_val; break; case TypeCode.SByte : res.prim_val = (System.Int64)left.prim_val + (sbyte)right.prim_val; break; case TypeCode.UInt16 : res.prim_val = (System.Int64)left.prim_val + (System.UInt16)right.prim_val; break; @@ -123,18 +123,18 @@ namespace CodeCompletion { switch(rcode) { - case TypeCode.Byte : res.prim_val = (string)left.prim_val + right.prim_val.ToString(); break; - case TypeCode.Int32 : res.prim_val = (string)left.prim_val + right.prim_val.ToString(); break; - case TypeCode.Double : res.prim_val = (string)left.prim_val + right.prim_val.ToString(); break; - case TypeCode.Int64 : res.prim_val = (string)left.prim_val + right.prim_val.ToString(); break; - case TypeCode.String : res.prim_val = (string)left.prim_val + right.prim_val.ToString(); break; - case TypeCode.Int16 : res.prim_val = (string)left.prim_val + right.prim_val.ToString(); break; - case TypeCode.SByte : res.prim_val = (string)left.prim_val + right.prim_val.ToString(); break; - case TypeCode.UInt16 : res.prim_val = (string)left.prim_val + right.prim_val.ToString(); break; - case TypeCode.UInt32 : res.prim_val = (string)left.prim_val + right.prim_val.ToString(); break; - case TypeCode.UInt64 : res.prim_val = (string)left.prim_val + right.prim_val.ToString(); break; - case TypeCode.Single : res.prim_val = (string)left.prim_val + right.prim_val.ToString(); break; - case TypeCode.Char : res.prim_val = (string)left.prim_val + right.prim_val.ToString(); break; + case TypeCode.Byte : res.string_val = left.string_val + right.prim_val.ToString(); break; + case TypeCode.Int32 : res.string_val = left.string_val + right.prim_val.ToString(); break; + case TypeCode.Double : res.string_val = left.string_val + right.prim_val.ToString(); break; + case TypeCode.Int64 : res.string_val = left.string_val + right.prim_val.ToString(); break; + case TypeCode.String : res.string_val = left.string_val + right.string_val; break; + case TypeCode.Int16 : res.string_val = left.string_val + right.prim_val.ToString(); break; + case TypeCode.SByte : res.string_val = left.string_val + right.prim_val.ToString(); break; + case TypeCode.UInt16 : res.string_val = left.string_val + right.prim_val.ToString(); break; + case TypeCode.UInt32 : res.string_val = left.string_val + right.prim_val.ToString(); break; + case TypeCode.UInt64 : res.string_val = left.string_val + right.prim_val.ToString(); break; + case TypeCode.Single : res.string_val = left.string_val + right.prim_val.ToString(); break; + case TypeCode.Char : res.string_val = left.string_val + right.prim_val.ToString(); break; } } break; @@ -146,7 +146,7 @@ namespace CodeCompletion case TypeCode.Int32 : res.prim_val = (System.SByte)left.prim_val + (int)right.prim_val; break; case TypeCode.Double : res.prim_val = (System.SByte)left.prim_val + (double)right.prim_val; break; case TypeCode.Int64 : res.prim_val = (System.SByte)left.prim_val + (long)right.prim_val; break; - case TypeCode.String : res.prim_val = ((System.SByte)left.prim_val).ToString() + (string)right.prim_val; break; + case TypeCode.String : res.string_val = ((System.SByte)left.prim_val).ToString() + right.string_val; break; case TypeCode.Int16 : res.prim_val = (System.SByte)left.prim_val + (System.Int16)right.prim_val; break; case TypeCode.SByte : res.prim_val = (System.SByte)left.prim_val + (sbyte)right.prim_val; break; case TypeCode.UInt16 : res.prim_val = (System.SByte)left.prim_val + (System.UInt16)right.prim_val; break; @@ -164,7 +164,7 @@ namespace CodeCompletion case TypeCode.Int32 : res.prim_val = (System.UInt16)left.prim_val + (int)right.prim_val; break; case TypeCode.Double : res.prim_val = (System.UInt16)left.prim_val + (double)right.prim_val; break; case TypeCode.Int64 : res.prim_val = (System.UInt16)left.prim_val + (long)right.prim_val; break; - case TypeCode.String : res.prim_val = ((System.UInt16)left.prim_val).ToString() + (string)right.prim_val; break; + case TypeCode.String : res.string_val = ((System.UInt16)left.prim_val).ToString() + right.string_val; break; case TypeCode.Int16 : res.prim_val = (System.UInt16)left.prim_val + (System.Int16)right.prim_val; break; case TypeCode.SByte : res.prim_val = (System.UInt16)left.prim_val + (sbyte)right.prim_val; break; case TypeCode.UInt16 : res.prim_val = (System.UInt16)left.prim_val + (System.UInt16)right.prim_val; break; @@ -182,7 +182,7 @@ namespace CodeCompletion case TypeCode.Int32 : res.prim_val = (System.UInt32)left.prim_val + (int)right.prim_val; break; case TypeCode.Double : res.prim_val = (System.UInt32)left.prim_val + (double)right.prim_val; break; case TypeCode.Int64 : res.prim_val = (System.UInt32)left.prim_val + (long)right.prim_val; break; - case TypeCode.String : res.prim_val = ((System.UInt32)left.prim_val).ToString() + (string)right.prim_val; break; + case TypeCode.String : res.string_val = ((System.UInt32)left.prim_val).ToString() + right.string_val; break; case TypeCode.Int16 : res.prim_val = (System.UInt32)left.prim_val + (System.Int16)right.prim_val; break; case TypeCode.SByte : res.prim_val = (System.UInt32)left.prim_val + (sbyte)right.prim_val; break; case TypeCode.UInt16 : res.prim_val = (System.UInt32)left.prim_val + (System.UInt16)right.prim_val; break; @@ -200,7 +200,7 @@ namespace CodeCompletion case TypeCode.Int32 : res.prim_val = (System.UInt64)left.prim_val + (System.UInt64)((int)right.prim_val); break; case TypeCode.Double : res.prim_val = (System.UInt64)left.prim_val + (double)right.prim_val; break; case TypeCode.Int64 : res.prim_val = (System.UInt64)left.prim_val + (System.UInt64)((long)right.prim_val); break; - case TypeCode.String : res.prim_val = ((System.UInt64)left.prim_val).ToString() + (string)right.prim_val; break; + case TypeCode.String : res.string_val = ((System.UInt64)left.prim_val).ToString() + right.string_val; break; case TypeCode.Int16 : res.prim_val = (System.UInt64)left.prim_val + (System.UInt64)((System.Int16)right.prim_val); break; case TypeCode.SByte : res.prim_val = (System.UInt64)left.prim_val + (System.UInt64)((sbyte)right.prim_val); break; case TypeCode.UInt16 : res.prim_val = (System.UInt64)left.prim_val + (System.UInt16)right.prim_val; break; @@ -218,7 +218,7 @@ namespace CodeCompletion case TypeCode.Int32 : res.prim_val = (System.Single)left.prim_val + (int)right.prim_val; break; case TypeCode.Double : res.prim_val = (System.Single)left.prim_val + (double)right.prim_val; break; case TypeCode.Int64 : res.prim_val = (System.Single)left.prim_val + (long)right.prim_val; break; - case TypeCode.String : res.prim_val = ((System.Single)left.prim_val).ToString() + (string)right.prim_val; break; + case TypeCode.String : res.string_val = ((System.Single)left.prim_val).ToString() + right.string_val; break; case TypeCode.Int16 : res.prim_val = (System.Single)left.prim_val + (System.Int16)right.prim_val; break; case TypeCode.SByte : res.prim_val = (System.Single)left.prim_val + (sbyte)right.prim_val; break; case TypeCode.UInt16 : res.prim_val = (System.Single)left.prim_val + (System.UInt16)right.prim_val; break; @@ -232,8 +232,8 @@ namespace CodeCompletion { switch(rcode) { - case TypeCode.Char : res.prim_val = (string)left.prim_val + (string)right.prim_val; break; - case TypeCode.String : res.prim_val = left.prim_val.ToString() + (string)right.prim_val; break; + case TypeCode.Char : res.string_val = left.string_val + right.string_val; break; + case TypeCode.String : res.string_val = left.prim_val.ToString() + right.string_val; break; } } break; diff --git a/TestSuite/intellisense_tests/stringconst1.pas b/TestSuite/intellisense_tests/stringconst1.pas new file mode 100644 index 000000000..f62fc2cab --- /dev/null +++ b/TestSuite/intellisense_tests/stringconst1.pas @@ -0,0 +1,17 @@ +const + s1 = 'abc'; + s2 = 'def'; + s3 = s1+s2; + s4 = s1+'d'; + s5 = s1+6; + i = 6; + s6 = s1 + i; + s7 = s1 + s2 + 'gh'; + +begin + writeln(s3{@const s3: string = 'abcdef';@}); + writeln(s4{@const s4: string = 'abcd';@}); + writeln(s5{@const s5: string = 'abc6';@}); + writeln(s6{@const s6: string = 'abc6';@}); + writeln(s7{@const s7: string = 'abcdefgh';@}); +end. \ No newline at end of file