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;
 | |
| }
 |