552 lines
14 KiB
Haxe
552 lines
14 KiB
Haxe
/*
|
|
* Copyright (C)2005-2019 Haxe Foundation
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
* copy of this software and associated documentation files (the "Software"),
|
|
* to deal in the Software without restriction, including without limitation
|
|
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
* and/or sell copies of the Software, and to permit persons to whom the
|
|
* Software is furnished to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included in
|
|
* all copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
* DEALINGS IN THE SOFTWARE.
|
|
*/
|
|
|
|
package haxe.display;
|
|
|
|
import haxe.display.JsonModuleTypes;
|
|
import haxe.display.Position;
|
|
import haxe.display.Protocol;
|
|
|
|
/**
|
|
Methods of the JSON-RPC-based `--display` protocol in Haxe 4.
|
|
A lot of the methods are *inspired* by the Language Server Protocol, but there is **no** intention to be directly compatible with it.
|
|
**/
|
|
@:publicFields
|
|
class DisplayMethods {
|
|
/**
|
|
The completion request is sent from the client to Haxe to request code completion.
|
|
Haxe automatically determines the type of completion to use based on the passed position, see `CompletionResultKind`.
|
|
**/
|
|
static inline var Completion = new HaxeRequestMethod<CompletionParams, CompletionResult>("display/completion");
|
|
|
|
/**
|
|
The request is sent from the client to Haxe to resolve additional information for a given completion item.
|
|
**/
|
|
static inline var CompletionItemResolve = new HaxeRequestMethod<CompletionItemResolveParams, CompletionItemResolveResult>("display/completionItem/resolve");
|
|
|
|
/**
|
|
The find references request is sent from the client to Haxe to find locations that reference the symbol at a given text document position.
|
|
**/
|
|
static inline var FindReferences = new HaxeRequestMethod<FindReferencesParams, GotoDefinitionResult>("display/references");
|
|
|
|
/**
|
|
The goto definition request is sent from the client to Haxe to resolve the definition location(s) of a symbol at a given text document position.
|
|
**/
|
|
static inline var GotoDefinition = new HaxeRequestMethod<PositionParams, GotoDefinitionResult>("display/definition");
|
|
|
|
/**
|
|
The goto implementation request is sent from the client to Haxe to resolve the implementation location(s) of a symbol at a given text document position.
|
|
**/
|
|
static inline var GotoImplementation = new HaxeRequestMethod<PositionParams, GotoDefinitionResult>("display/implementation");
|
|
|
|
/**
|
|
The goto type definition request is sent from the client to Haxe to resolve the type definition location(s) of a symbol at a given text document position.
|
|
**/
|
|
static inline var GotoTypeDefinition = new HaxeRequestMethod<PositionParams, GotoTypeDefinitionResult>("display/typeDefinition");
|
|
|
|
/**
|
|
The hover request is sent from the client to Haxe to request hover information at a given text document position.
|
|
**/
|
|
static inline var Hover = new HaxeRequestMethod<PositionParams, HoverResult>("display/hover");
|
|
|
|
/**
|
|
This request is sent from the client to Haxe to determine the package for a given file, based on class paths configuration.
|
|
**/
|
|
static inline var DeterminePackage = new HaxeRequestMethod<FileParams, DeterminePackageResult>("display/package");
|
|
|
|
/**
|
|
The signature help request is sent from the client to Haxe to request signature information at a given cursor position.
|
|
**/
|
|
static inline var SignatureHelp = new HaxeRequestMethod<SignatureHelpParams, SignatureHelpResult>("display/signatureHelp");
|
|
|
|
/*
|
|
TODO:
|
|
|
|
- finish completion
|
|
- diagnostics
|
|
- codeLens
|
|
- workspaceSymbols ("project/symbol"?)
|
|
*/
|
|
}
|
|
|
|
/** Completion **/
|
|
typedef CompletionParams = PositionParams & {
|
|
var wasAutoTriggered:Bool;
|
|
|
|
/** list of metas to include in responses **/
|
|
var ?meta:Array<String>;
|
|
}
|
|
|
|
typedef FieldResolution = {
|
|
/**
|
|
Whether it's valid to use the unqualified name of the field or not.
|
|
This is `false` if the identifier is shadowed.
|
|
**/
|
|
var isQualified:Bool;
|
|
|
|
/**
|
|
The qualifier that has to be inserted to use the field if `!isQualified`.
|
|
Can either be `this` or `super` for instance fields for the type name for `static` fields.
|
|
**/
|
|
var qualifier:String;
|
|
}
|
|
|
|
typedef DisplayLocal<T> = {
|
|
var id:Int;
|
|
var name:String;
|
|
var type:JsonType<T>;
|
|
var origin:LocalOrigin;
|
|
var capture:Bool;
|
|
var ?extra:{
|
|
var params:Array<JsonTypeParameter>;
|
|
var expr:JsonExpr;
|
|
};
|
|
var meta:JsonMetadata;
|
|
var pos:JsonPos;
|
|
var isInline:Bool;
|
|
var isFinal:Bool;
|
|
}
|
|
|
|
enum abstract LocalOrigin(Int) {
|
|
var LocalVariable;
|
|
var Argument;
|
|
var ForVariable;
|
|
var PatternVariable;
|
|
var CatchVariable;
|
|
var LocalFunction;
|
|
}
|
|
|
|
enum abstract ClassFieldOriginKind<T>(Int) {
|
|
/**
|
|
The field is declared on the current type itself.
|
|
**/
|
|
var Self:ClassFieldOriginKind<JsonModuleType<T>>;
|
|
|
|
/**
|
|
The field is a static field brought into context via a static import
|
|
(`import pack.Module.Type.field`).
|
|
**/
|
|
var StaticImport:ClassFieldOriginKind<JsonModuleType<T>>;
|
|
|
|
/**
|
|
The field is declared on a parent type, such as:
|
|
- a super class field that is not overriden
|
|
- a forwarded abstract field
|
|
**/
|
|
var Parent:ClassFieldOriginKind<JsonModuleType<T>>;
|
|
|
|
/**
|
|
The field is a static extension method brought
|
|
into context with the `using` keyword.
|
|
**/
|
|
var StaticExtension:ClassFieldOriginKind<JsonModuleType<T>>;
|
|
|
|
/**
|
|
This field doesn't belong to any named type, just an anonymous structure.
|
|
**/
|
|
var AnonymousStructure:ClassFieldOriginKind<JsonAnon>;
|
|
|
|
/**
|
|
Special fields built into the compiler, such as:
|
|
- `code` on single-character Strings
|
|
- `bind()` on functions.
|
|
**/
|
|
var BuiltIn:ClassFieldOriginKind<NoData>;
|
|
|
|
/**
|
|
The origin of this class field is unknown.
|
|
**/
|
|
var Unknown:ClassFieldOriginKind<NoData>;
|
|
}
|
|
|
|
typedef ClassFieldOrigin<T> = {
|
|
var kind:ClassFieldOriginKind<T>;
|
|
var ?args:T;
|
|
}
|
|
|
|
typedef ClassFieldOccurrence<T> = {
|
|
var field:JsonClassField;
|
|
var resolution:FieldResolution;
|
|
var ?origin:ClassFieldOrigin<T>;
|
|
}
|
|
|
|
enum abstract EnumFieldOriginKind<T>(Int) {
|
|
/**
|
|
The enum value is declared on the current type itself.
|
|
**/
|
|
var Self:EnumFieldOriginKind<JsonModuleType<T>>;
|
|
|
|
/**
|
|
The enum value is brought into context via a static import
|
|
(`import pack.Module.Enum.Value`).
|
|
**/
|
|
var StaticImport:EnumFieldOriginKind<JsonModuleType<T>>;
|
|
}
|
|
|
|
typedef EnumFieldOrigin<T> = {
|
|
var kind:EnumFieldOriginKind<T>;
|
|
var ?args:T;
|
|
}
|
|
|
|
typedef EnumFieldOccurrence<T> = {
|
|
var field:JsonEnumField;
|
|
var resolution:FieldResolution;
|
|
var ?origin:EnumFieldOrigin<T>;
|
|
}
|
|
|
|
enum abstract Literal(String) {
|
|
var Null = "null";
|
|
var True = "true";
|
|
var False = "false";
|
|
var This = "this";
|
|
var Trace = "trace";
|
|
}
|
|
|
|
enum abstract DisplayModuleTypeKind(Int) {
|
|
var Class;
|
|
var Interface;
|
|
var Enum;
|
|
var Abstract;
|
|
var EnumAbstract;
|
|
|
|
/** A `typedef` that is just an alias for another type. **/
|
|
var TypeAlias;
|
|
|
|
/** A `typedef` that is an alias for an anonymous structure. **/
|
|
var Struct;
|
|
|
|
/** A type name introduced by `import as` / `import in` **/
|
|
// var ImportAlias;
|
|
}
|
|
|
|
typedef DisplayModuleType = {
|
|
var path:JsonTypePath;
|
|
var pos:JsonPos;
|
|
var isPrivate:Bool;
|
|
var params:Array<DisplayModuleTypeParameter>;
|
|
var meta:JsonMetadata;
|
|
var doc:JsonDoc;
|
|
var isExtern:Bool;
|
|
var isFinal:Bool;
|
|
var isAbstract:Bool;
|
|
var kind:DisplayModuleTypeKind;
|
|
}
|
|
|
|
typedef DisplayModuleTypeParameter = {
|
|
var name:String;
|
|
var meta:JsonMetadata;
|
|
var constraints:Array<JsonType<Dynamic>>;
|
|
}
|
|
|
|
typedef DisplayLiteral<T> = {
|
|
var name:String;
|
|
}
|
|
|
|
enum abstract MetadataTarget(String) {
|
|
var Class = "TClass";
|
|
var ClassField = "TClassField";
|
|
var Abstract = "TAbstract";
|
|
var AbstractField = "TAbstractField";
|
|
var Enum = "TEnum";
|
|
var Typedef = "TTypedef";
|
|
var AnyField = "TAnyField";
|
|
var Expr = "TExpr";
|
|
var TypeParameter = "TTypeParameter";
|
|
}
|
|
|
|
enum abstract Platform(String) {
|
|
var Cross = "cross";
|
|
var Js = "js";
|
|
var Lua = "lua";
|
|
var Neko = "neko";
|
|
var Flash = "flash";
|
|
var Php = "php";
|
|
var Cpp = "cpp";
|
|
var Cs = "cs";
|
|
var Java = "java";
|
|
var Python = "python";
|
|
var Hl = "hl";
|
|
var Eval = "eval";
|
|
}
|
|
|
|
typedef Metadata = {
|
|
var name:String;
|
|
var doc:JsonDoc;
|
|
var parameters:Array<String>;
|
|
var platforms:Array<Platform>;
|
|
var targets:Array<MetadataTarget>;
|
|
var internal:Bool;
|
|
var ?links:Array<String>;
|
|
}
|
|
|
|
typedef Define = {
|
|
var name:String;
|
|
var value:Null<String>;
|
|
var doc:JsonDoc;
|
|
var parameters:Array<String>;
|
|
var platforms:Array<Platform>;
|
|
var links:Array<String>;
|
|
}
|
|
|
|
typedef Keyword = {
|
|
var name:KeywordKind;
|
|
}
|
|
|
|
enum abstract KeywordKind(String) to String {
|
|
var Implements = "implements";
|
|
var Extends = "extends";
|
|
var Function = "function";
|
|
var Var = "var";
|
|
var If = "if";
|
|
var Else = "else";
|
|
var While = "while";
|
|
var Do = "do";
|
|
var For = "for";
|
|
var Break = "break";
|
|
var Return = "return";
|
|
var Continue = "continue";
|
|
var Switch = "switch";
|
|
var Case = "case";
|
|
var Default = "default";
|
|
var Try = "try";
|
|
var Catch = "catch";
|
|
var New = "new";
|
|
var Throw = "throw";
|
|
var Untyped = "untyped";
|
|
var Cast = "cast";
|
|
var Macro = "macro";
|
|
var Package = "package";
|
|
var Import = "import";
|
|
var Using = "using";
|
|
var Public = "public";
|
|
var Private = "private";
|
|
var Static = "static";
|
|
var Extern = "extern";
|
|
var Dynamic = "dynamic";
|
|
var Override = "override";
|
|
var Overload = "overload";
|
|
var Class = "class";
|
|
var Interface = "interface";
|
|
var Enum = "enum";
|
|
var Abstract = "abstract";
|
|
var Typedef = "typedef";
|
|
var Final = "final";
|
|
var Inline = "inline";
|
|
}
|
|
|
|
/* enum abstract PackageContentKind(Int) {
|
|
var Module;
|
|
var Package;
|
|
}*/
|
|
typedef Package = {
|
|
var path:JsonPackagePath;
|
|
// var ?contents:Array<{name:String, kind:PackageContentKind}>;
|
|
}
|
|
|
|
typedef Module = {
|
|
var path:JsonModulePath;
|
|
// var ?contents:Array<ModuleType>;
|
|
}
|
|
|
|
enum abstract DisplayItemKind<T>(String) {
|
|
var Local:DisplayItemKind<DisplayLocal<Dynamic>>;
|
|
var ClassField:DisplayItemKind<ClassFieldOccurrence<Dynamic>>;
|
|
var EnumField:DisplayItemKind<EnumFieldOccurrence<Dynamic>>;
|
|
|
|
/** Only for the enum values in enum abstracts, other fields use `ClassField`. **/
|
|
var EnumAbstractField:DisplayItemKind<ClassFieldOccurrence<Dynamic>>;
|
|
|
|
var Type:DisplayItemKind<DisplayModuleType>;
|
|
var Package:DisplayItemKind<Package>;
|
|
var Module:DisplayItemKind<Module>;
|
|
var Literal:DisplayItemKind<DisplayLiteral<Dynamic>>;
|
|
var Metadata:DisplayItemKind<Metadata>;
|
|
var Keyword:DisplayItemKind<Keyword>;
|
|
var AnonymousStructure:DisplayItemKind<JsonAnon>;
|
|
var Expression:DisplayItemKind<JsonTExpr>;
|
|
var TypeParameter:DisplayItemKind<DisplayModuleTypeParameter>;
|
|
var Define:DisplayItemKind<Define>;
|
|
}
|
|
|
|
typedef DisplayItem<T> = {
|
|
var kind:DisplayItemKind<T>;
|
|
var args:T;
|
|
var ?type:JsonType<Dynamic>;
|
|
var ?index:Int;
|
|
}
|
|
|
|
typedef DisplayItemOccurrence<T> = {
|
|
var range:Range;
|
|
var item:DisplayItem<T>;
|
|
var ?moduleType:JsonModuleType<Dynamic>;
|
|
var ?moduleTypeFollowed:JsonModuleType<Dynamic>;
|
|
}
|
|
|
|
typedef FieldCompletionSubject<T> = DisplayItemOccurrence<T> & {
|
|
var ?iterator:{
|
|
var type:JsonType<Dynamic>;
|
|
};
|
|
var ?keyValueIterator:{
|
|
var key:JsonType<Dynamic>;
|
|
var value:JsonType<Dynamic>;
|
|
};
|
|
}
|
|
|
|
typedef ToplevelCompletion<T> = {
|
|
var ?expectedType:JsonType<T>;
|
|
var ?expectedTypeFollowed:JsonType<T>;
|
|
var ?compatibleTypes:Array<JsonType<Dynamic>>;
|
|
}
|
|
|
|
typedef StructExtensionCompletion = {
|
|
var isIntersectionType:Bool;
|
|
}
|
|
|
|
typedef PatternCompletion<T> = ToplevelCompletion<T> & {
|
|
var isOutermostPattern:Bool;
|
|
}
|
|
|
|
enum abstract CompletionModeKind<T>(Int) {
|
|
var Field:CompletionModeKind<FieldCompletionSubject<Dynamic>>;
|
|
var StructureField;
|
|
var Toplevel:CompletionModeKind<ToplevelCompletion<Dynamic>>;
|
|
var Metadata;
|
|
var TypeHint;
|
|
var Extends;
|
|
var Implements;
|
|
var StructExtension:CompletionModeKind<StructExtensionCompletion>;
|
|
var Import;
|
|
var Using;
|
|
var New;
|
|
var Pattern:CompletionModeKind<PatternCompletion<Dynamic>>;
|
|
var Override;
|
|
var TypeRelation;
|
|
var TypeDeclaration;
|
|
}
|
|
|
|
typedef CompletionMode<T> = {
|
|
var kind:CompletionModeKind<T>;
|
|
var ?args:T;
|
|
}
|
|
|
|
typedef CompletionResponse<T1, T2> = {
|
|
var items:Array<DisplayItem<T1>>;
|
|
var mode:CompletionMode<T2>;
|
|
var ?replaceRange:Range;
|
|
var ?isIncomplete:Bool;
|
|
var ?filterString:String;
|
|
}
|
|
|
|
typedef CompletionResult = Response<Null<CompletionResponse<Dynamic, Dynamic>>>;
|
|
|
|
/** CompletionItem Resolve **/
|
|
typedef CompletionItemResolveParams = {
|
|
var index:Int;
|
|
};
|
|
|
|
typedef CompletionItemResolveResult = Response<{
|
|
var item:DisplayItem<Dynamic>;
|
|
}>;
|
|
|
|
/** FindReferences **/
|
|
typedef FindReferencesParams = PositionParams & {
|
|
var ?kind:FindReferencesKind;
|
|
}
|
|
|
|
enum abstract FindReferencesKind(String) to String {
|
|
/**
|
|
Find only direct references to the requested symbol.
|
|
Does not look for references to parent or overriding methods.
|
|
**/
|
|
var Direct = "direct";
|
|
|
|
/**
|
|
Find references to the base field and all the overidding fields in the inheritance chain.
|
|
**/
|
|
var WithBaseAndDescendants = "withBaseAndDescendants";
|
|
|
|
/**
|
|
Find references to the requested field and references to all
|
|
descendants of the requested field.
|
|
**/
|
|
var WithDescendants = "withDescendants";
|
|
}
|
|
|
|
/** GotoDefinition **/
|
|
typedef GotoDefinitionResult = Response<Array<Location>>;
|
|
|
|
/** GotoTypeDefinition **/
|
|
typedef GotoTypeDefinitionResult = Response<Array<Location>>;
|
|
|
|
/** Hover **/
|
|
typedef HoverResult = Response<Null<HoverDisplayItemOccurence<Dynamic>>>;
|
|
|
|
typedef HoverDisplayItemOccurence<T> = DisplayItemOccurrence<T> & {
|
|
var ?expected:{
|
|
var ?type:JsonType<Dynamic>;
|
|
var ?name:{
|
|
var name:String;
|
|
var kind:HoverExpectedNameKind;
|
|
var ?doc:String;
|
|
};
|
|
};
|
|
}
|
|
|
|
enum abstract HoverExpectedNameKind(Int) {
|
|
var FunctionArgument;
|
|
var StructureField;
|
|
}
|
|
|
|
/** DeterminePackage **/
|
|
typedef DeterminePackageResult = Response<Array<String>>;
|
|
|
|
/** SignatureHelp **/
|
|
typedef SignatureHelpParams = PositionParams & {
|
|
var wasAutoTriggered:Bool;
|
|
}
|
|
|
|
typedef SignatureInformation = JsonFunctionSignature & {
|
|
var ?documentation:String;
|
|
}
|
|
|
|
enum abstract SignatureItemKind(Int) {
|
|
var Call;
|
|
var ArrayAccess;
|
|
}
|
|
|
|
typedef SignatureItem = {
|
|
var signatures:Array<SignatureInformation>;
|
|
var activeSignature:Int;
|
|
var activeParameter:Int;
|
|
var kind:SignatureItemKind;
|
|
}
|
|
|
|
typedef SignatureHelpResult = Response<Null<SignatureItem>>;
|
|
|
|
/** General types **/
|
|
typedef PositionParams = FileParams & {
|
|
/** Unicode character offset in the file. **/
|
|
var offset:Int;
|
|
|
|
var ?contents:String;
|
|
}
|