1 /** 2 * Copyright (c) 2025 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef ES2PANDA_LSP_INCLUDE_TYPES_H 17 #define ES2PANDA_LSP_INCLUDE_TYPES_H 18 19 #include <cstddef> 20 #include <string> 21 #include <vector> 22 #include "formatting/formatting.h" 23 #include "user_preferences.h" 24 25 // NOLINTBEGIN 26 27 #ifdef __cplusplus 28 extern "C" { 29 #endif 30 31 struct TextSpan { 32 size_t start; 33 size_t length; TextSpanTextSpan34 TextSpan(size_t s, size_t l) : start(s), length(l) {} 35 bool operator==(const TextSpan &other) const 36 { 37 return start == other.start && length == other.length; 38 } 39 bool operator!=(const TextSpan &other) const 40 { 41 return !(*this == other); 42 } 43 }; 44 45 struct SymbolDisplayPart { 46 private: 47 std::string text_; 48 std::string kind_; 49 50 public: 51 explicit SymbolDisplayPart(std::string text = "", std::string kind = "") 52 : text_ {std::move(text)}, kind_ {std::move(kind)} 53 { 54 } 55 SetTextSymbolDisplayPart56 void SetText(const std::string &newText) 57 { 58 text_ = newText; 59 } SetKindSymbolDisplayPart60 void SetKind(const std::string &newKind) 61 { 62 kind_ = newKind; 63 } GetTextSymbolDisplayPart64 std::string GetText() const 65 { 66 return text_; 67 } GetKindSymbolDisplayPart68 std::string GetKind() const 69 { 70 return kind_; 71 } 72 73 bool operator==(const SymbolDisplayPart &other) const 74 { 75 return text_ == other.text_ && kind_ == other.kind_; 76 } 77 bool operator!=(const SymbolDisplayPart &other) const 78 { 79 return !(*this == other); 80 } 81 }; 82 83 struct TextChange { 84 TextSpan span; 85 std::string newText; TextChangeTextChange86 TextChange(TextSpan s, const std::string &t) : span(s), newText(t) {} 87 }; 88 89 struct FileTextChanges { 90 std::string fileName; 91 std::vector<TextChange> textChanges; FileTextChangesFileTextChanges92 FileTextChanges(const std::string &f, const std::vector<TextChange> &t) : fileName(f), textChanges(t) {} 93 FileTextChanges() = default; 94 }; 95 96 enum class InlayHintKind { 97 TYPE, 98 PARAMETER, 99 ENUM, 100 }; 101 102 struct InlayHint { 103 std::string text; 104 int number; 105 InlayHintKind kind; 106 bool whitespaceBefore; 107 bool whitespaceAfter; 108 }; 109 110 struct InlayHintList { 111 std::vector<InlayHint> hints; 112 }; 113 114 struct SignatureHelpParameter { 115 private: 116 std::string name_; 117 std::vector<SymbolDisplayPart> documentation_; 118 std::vector<SymbolDisplayPart> displayParts_; 119 120 public: SetNameSignatureHelpParameter121 void SetName(const std::string &newName) 122 { 123 this->name_ = newName; 124 } SetDocumentationSignatureHelpParameter125 void SetDocumentation(const SymbolDisplayPart &part) 126 { 127 documentation_.push_back(part); 128 } 129 SetDisplayPartsSignatureHelpParameter130 void SetDisplayParts(const SymbolDisplayPart &part) 131 { 132 displayParts_.push_back(part); 133 } GetNameSignatureHelpParameter134 const std::string &GetName() const 135 { 136 return name_; 137 } GetNameSignatureHelpParameter138 std::string &GetName() 139 { 140 return name_; 141 } GetDocumentationSignatureHelpParameter142 const std::vector<SymbolDisplayPart> &GetDocumentation() const 143 { 144 return documentation_; 145 } GetDisplayPartsSignatureHelpParameter146 const std::vector<SymbolDisplayPart> &GetDisplayParts() const 147 { 148 return displayParts_; 149 } ClearSignatureHelpParameter150 void Clear() 151 { 152 displayParts_.clear(); 153 documentation_.clear(); 154 } 155 }; 156 struct SignatureHelpItem { 157 private: 158 std::vector<SymbolDisplayPart> prefixDisplayParts_; 159 std::vector<SymbolDisplayPart> suffixDisplayParts_; 160 std::vector<SymbolDisplayPart> separatorDisplayParts_; 161 std::vector<SignatureHelpParameter> parameters_; 162 std::vector<SymbolDisplayPart> documentation_; 163 164 public: SetPrefixDisplayPartsSignatureHelpItem165 void SetPrefixDisplayParts(const SymbolDisplayPart &part) 166 { 167 prefixDisplayParts_.push_back(part); 168 } 169 SetSuffixDisplayPartsSignatureHelpItem170 void SetSuffixDisplayParts(const SymbolDisplayPart &part) 171 { 172 suffixDisplayParts_.push_back(part); 173 } SetSeparatorDisplayPartsSignatureHelpItem174 void SetSeparatorDisplayParts(const SymbolDisplayPart &part) 175 { 176 separatorDisplayParts_.push_back(part); 177 } SetPrefixDisplayPartsSignatureHelpItem178 void SetPrefixDisplayParts(const std::string &text, const std::string &kind) 179 { 180 prefixDisplayParts_.emplace_back(SymbolDisplayPart(text, kind)); 181 } 182 SetParametersSignatureHelpItem183 void SetParameters(SignatureHelpParameter ¶meter) 184 { 185 parameters_.push_back(parameter); 186 } SetDocumentationSignatureHelpItem187 void SetDocumentation(const std::string &text, const std::string &kind) 188 { 189 documentation_.emplace_back(SymbolDisplayPart(text, kind)); 190 } 191 GetPrefixDisplayPartsSignatureHelpItem192 const std::vector<SymbolDisplayPart> &GetPrefixDisplayParts() const 193 { 194 return prefixDisplayParts_; 195 } GetSuffixDisplayPartsSignatureHelpItem196 const std::vector<SymbolDisplayPart> &GetSuffixDisplayParts() const 197 { 198 return suffixDisplayParts_; 199 } GetSeparatorDisplayPartsSignatureHelpItem200 const std::vector<SymbolDisplayPart> &GetSeparatorDisplayParts() const 201 { 202 return separatorDisplayParts_; 203 } GetParametersSignatureHelpItem204 const std::vector<SignatureHelpParameter> &GetParameters() const 205 { 206 return parameters_; 207 } GetDocumentationSignatureHelpItem208 const std::vector<SymbolDisplayPart> &GetDocumentation() const 209 { 210 return documentation_; 211 } ClearSignatureHelpItem212 void Clear() 213 { 214 prefixDisplayParts_.clear(); 215 suffixDisplayParts_.clear(); 216 separatorDisplayParts_.clear(); 217 for (auto parameter : parameters_) { 218 parameter.Clear(); 219 } 220 parameters_.clear(); 221 documentation_.clear(); 222 } 223 }; 224 225 struct LanguageServiceHost { 226 std::string name = "lsp"; 227 }; 228 229 struct TextChangesContext { 230 LanguageServiceHost host = {}; 231 ark::es2panda::lsp::FormatContext formatContext; 232 ark::es2panda::lsp::UserPreferences preferences; 233 }; 234 235 struct SignatureHelpItems { 236 private: 237 std::vector<SignatureHelpItem> items_; 238 TextSpan applicableSpan_ {0, 0}; 239 size_t selectedItemIndex_ {0}; 240 size_t argumentIndex_ {0}; 241 size_t argumentCount_ {0}; 242 243 public: SetItemsSignatureHelpItems244 void SetItems(const SignatureHelpItem &item) 245 { 246 items_.push_back(item); 247 } SetApplicableSpanSignatureHelpItems248 void SetApplicableSpan(const size_t &start, const size_t &line) 249 { 250 applicableSpan_.start = start; 251 applicableSpan_.length = line; 252 applicableSpan_.start = start; 253 applicableSpan_.length = line; 254 } SetSelectedItemIndexSignatureHelpItems255 void SetSelectedItemIndex(const size_t &index) 256 { 257 selectedItemIndex_ = index; 258 } SetArgumentIndexSignatureHelpItems259 void SetArgumentIndex(const size_t &index) 260 { 261 argumentIndex_ = index; 262 } SetArgumentCountSignatureHelpItems263 void SetArgumentCount(const size_t &count) 264 { 265 argumentCount_ = count; 266 } 267 GetItemSignatureHelpItems268 SignatureHelpItem &GetItem(size_t index) 269 { 270 return items_[index]; 271 } GetItemsSignatureHelpItems272 const std::vector<SignatureHelpItem> &GetItems() const 273 { 274 return items_; 275 } GetApplicableSpanSignatureHelpItems276 const TextSpan &GetApplicableSpan() const 277 { 278 return applicableSpan_; 279 } GetSelectedItemIndexSignatureHelpItems280 size_t GetSelectedItemIndex() const 281 { 282 return selectedItemIndex_; 283 } GetArgumentIndexSignatureHelpItems284 size_t GetArgumentIndex() const 285 { 286 return argumentIndex_; 287 } GetArgumentCountSignatureHelpItems288 size_t GetArgumentCount() const 289 { 290 return argumentCount_; 291 } ClearSignatureHelpItems292 void Clear() 293 { 294 for (auto item : items_) { 295 item.Clear(); 296 } 297 items_.clear(); 298 } 299 }; 300 301 #ifdef __cplusplus 302 } 303 #endif 304 305 SymbolDisplayPart CreatePunctuation(std::string punc); 306 SymbolDisplayPart CreateKeyword(std::string keyword); 307 SymbolDisplayPart CreateSpace(); 308 SymbolDisplayPart CreateText(std::string text); 309 SymbolDisplayPart CreateClassName(std::string className); 310 SymbolDisplayPart CreateFunctionName(std::string functionName); 311 SymbolDisplayPart CreateTypeName(std::string typeName); 312 SymbolDisplayPart CreateEnumName(std::string enumName); 313 SymbolDisplayPart CreateEnumMember(std::string enumMember); 314 SymbolDisplayPart CreateInterface(std::string interface); 315 SymbolDisplayPart CreateTypeParameter(std::string typeParameter); 316 SymbolDisplayPart CreateFunctionParameter(std::string functionParameter); 317 SymbolDisplayPart CreateOperator(std::string oper); 318 SymbolDisplayPart CreateReturnType(std::string returnType); 319 SymbolDisplayPart CreateProperty(std::string property); 320 SymbolDisplayPart CreateNamespace(std::string name); 321 SymbolDisplayPart SignatureCreateStructName(const std::string &name); 322 SymbolDisplayPart SignatureCreateParameterName(std::string &type); 323 324 // NOLINTEND 325 326 #endif