diff --git a/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/base/CodeActionRequestParams.scala b/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/base/CodeActionRequestParams.scala index c6d43c8ccf..5f86af2cd0 100644 --- a/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/base/CodeActionRequestParams.scala +++ b/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/base/CodeActionRequestParams.scala @@ -7,22 +7,22 @@ import org.mulesoft.als.common.DirectoryResolver import org.mulesoft.als.common.cache.{ASTPartBranchCached, ObjectInTreeCached} import org.mulesoft.als.common.dtoTypes.PositionRange import org.mulesoft.als.configuration.AlsConfigurationReader -import org.mulesoft.amfintegration.amfconfiguration.ALSConfigurationState +import org.mulesoft.amfintegration.amfconfiguration.{ALSConfigurationState, DocumentDefinition} import org.mulesoft.amfintegration.relationships.RelationshipLink import org.mulesoft.lsp.feature.codeactions.CodeActionParams case class CodeActionRequestParams( - uri: String, - range: PositionRange, - bu: BaseUnit, - tree: ObjectInTreeCached, - astPartBranchCached: ASTPartBranchCached, - definedBy: Dialect, - configuration: AlsConfigurationReader, - allRelationships: Seq[RelationshipLink], - alsConfigurationState: ALSConfigurationState, - uuid: String, - directoryResolver: DirectoryResolver + uri: String, + range: PositionRange, + bu: BaseUnit, + tree: ObjectInTreeCached, + astPartBranchCached: ASTPartBranchCached, + documentDefinition: DocumentDefinition, + configuration: AlsConfigurationReader, + allRelationships: Seq[RelationshipLink], + alsConfigurationState: ALSConfigurationState, + uuid: String, + directoryResolver: DirectoryResolver ) { val findDialectForSemantic: String => Option[(SemanticExtension, Dialect)] = @@ -32,15 +32,15 @@ case class CodeActionRequestParams( object CodeActionParamsImpl { implicit class CodeActionParamsImpl(param: CodeActionParams) { def toRequestParams( - bu: BaseUnit, - tree: ObjectInTreeCached, - astPartBranch: ASTPartBranchCached, - dialect: Dialect, - configuration: AlsConfigurationReader, - allRelationships: Seq[RelationshipLink], - alsConfigurationState: ALSConfigurationState, - uuid: String, - directoryResolver: DirectoryResolver + bu: BaseUnit, + tree: ObjectInTreeCached, + astPartBranch: ASTPartBranchCached, + documentDefinition: DocumentDefinition, + configuration: AlsConfigurationReader, + allRelationships: Seq[RelationshipLink], + alsConfigurationState: ALSConfigurationState, + uuid: String, + directoryResolver: DirectoryResolver ): CodeActionRequestParams = CodeActionRequestParams( param.textDocument.uri, @@ -48,7 +48,7 @@ object CodeActionParamsImpl { bu, tree, astPartBranch, - dialect, + documentDefinition, configuration, allRelationships, alsConfigurationState, diff --git a/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/conversions/JsonSchemaToRamlType.scala b/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/conversions/JsonSchemaToRamlType.scala index 554d1a7c71..2db99eff98 100644 --- a/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/conversions/JsonSchemaToRamlType.scala +++ b/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/conversions/JsonSchemaToRamlType.scala @@ -95,7 +95,7 @@ class JsonSchemaToRamlType(override protected val params: CodeActionRequestParam private def renderRamlType(shape: AnyShape): Future[String] = Future { shape.annotations.reject(_.isInstanceOf[ParsedJSONSchema]) - val node: Option[YNode] = declaredElementNode(Some(shape), params.definedBy, alsConfigurationState) + val node: Option[YNode] = declaredElementNode(Some(shape), params.documentDefinition, alsConfigurationState) val parent = yPartBranch.flatMap(_.closestEntry) node .map( diff --git a/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/ExtractRamlType.scala b/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/ExtractRamlType.scala index 0950c1c0a6..1b6f00eda8 100644 --- a/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/ExtractRamlType.scala +++ b/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/ExtractRamlType.scala @@ -5,21 +5,22 @@ import amf.core.client.scala.model.domain.AmfObject import org.mulesoft.als.actions.codeactions.plugins.declarations.common.BaseElementDeclarableExtractors import org.mulesoft.als.common.ObjectInTree import org.mulesoft.amfintegration.AmfImplicits.AmfAnnotationsImp +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition trait ExtractRamlType extends BaseElementDeclarableExtractors { protected override lazy val amfObject: Option[AmfObject] = extractRamlType protected def extractRamlType: Option[AmfObject] = - extractJsonSchema(maybeTree, params.definedBy) orElse extractAmfObject(maybeTree, params.definedBy) + extractJsonSchema(maybeTree, params.documentDefinition) orElse extractAmfObject(maybeTree, params.documentDefinition) /** Get the RAML type definition that encapsulates the Json schema, not the Json schema shape */ - protected override def extractable(maybeObject: Option[AmfObject], dialect: Dialect): Option[AmfObject] = - super.extractable(maybeObject, dialect).filterNot(_.annotations.schemeIsJsonSchema) + protected override def extractable(maybeObject: Option[AmfObject], documentDefinition: DocumentDefinition): Option[AmfObject] = + super.extractable(maybeObject, documentDefinition).filterNot(_.annotations.schemeIsJsonSchema) /** Extract Json schema as a whole, do not allow to extract individual properties */ - private def extractJsonSchema(maybeTree: Option[ObjectInTree], dialect: Dialect): Option[AmfObject] = - extractable(maybeTree.flatMap(_.stack.dropWhile(!_.annotations.schemeIsJsonSchema).drop(1).headOption), dialect) + private def extractJsonSchema(maybeTree: Option[ObjectInTree], documentDefinition: DocumentDefinition): Option[AmfObject] = + extractable(maybeTree.flatMap(_.stack.dropWhile(!_.annotations.schemeIsJsonSchema).drop(1).headOption), documentDefinition) } diff --git a/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/common/BaseElementDeclarableExtractors.scala b/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/common/BaseElementDeclarableExtractors.scala index 47fd8706f8..863a7c7cef 100644 --- a/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/common/BaseElementDeclarableExtractors.scala +++ b/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/common/BaseElementDeclarableExtractors.scala @@ -12,6 +12,7 @@ import org.mulesoft.als.common.dtoTypes.PositionRange import org.mulesoft.als.convert.LspRangeConverter import org.mulesoft.als.declarations.DeclarationCreator import org.mulesoft.amfintegration.AmfImplicits.{AmfAnnotationsImp, AmfObjectImp, BaseUnitImp, DialectImplicits} +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition import org.mulesoft.lsp.edit.TextEdit import org.mulesoft.lsp.feature.common.Range import org.yaml.model._ @@ -29,7 +30,7 @@ trait BaseElementDeclarableExtractors extends TreeKnowledge with DeclarationCrea private lazy val baseName: String = amfObject - .flatMap(ExtractorCommon.declarationName(_, params.definedBy)) + .flatMap(ExtractorCommon.declarationName(_, params.documentDefinition)) .getOrElse("newDeclaration") /** Placeholder for the new name (key and reference) @@ -37,18 +38,18 @@ trait BaseElementDeclarableExtractors extends TreeKnowledge with DeclarationCrea protected def newName: String = ExtractorCommon.nameNotInList(baseName, params.bu.declaredNames.toSet) protected lazy val amfObject: Option[AmfObject] = - extractAmfObject(maybeTree, params.definedBy) + extractAmfObject(maybeTree, params.documentDefinition) /** Selected object if there is a clean match in the range and it is a declarable, or the parents range */ - protected final def extractAmfObject(maybeTree: Option[ObjectInTree], dialect: Dialect): Option[AmfObject] = - extractable(maybeTree.map(_.obj), dialect) orElse - extractable(maybeTree.flatMap(_.stack.headOption), dialect) + protected final def extractAmfObject(maybeTree: Option[ObjectInTree], documentDefinition: DocumentDefinition): Option[AmfObject] = + extractable(maybeTree.map(_.obj), documentDefinition) orElse + extractable(maybeTree.flatMap(_.stack.headOption), documentDefinition) - protected def extractable(maybeObject: Option[AmfObject], dialect: Dialect): Option[AmfObject] = + protected def extractable(maybeObject: Option[AmfObject], documentDefinition: DocumentDefinition): Option[AmfObject] = maybeObject .filterNot(_.isInstanceOf[Document]) - .find(o => o.declarableKey(dialect).isDefined) + .find(o => o.declarableKey(documentDefinition).isDefined) /** The original node with lexical info for the declared node */ @@ -110,7 +111,7 @@ trait BaseElementDeclarableExtractors extends TreeKnowledge with DeclarationCrea JsonRender.render(rl.getOrElse(jsonRefEntry), entryIndentation + jsonOptions.indentationSize, jsonOptions) ) ) - else if (params.definedBy.isJsonStyle) + else if (params.documentDefinition.isJsonStyle) entryRange.map( TextEdit( _, diff --git a/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/common/ConverterExtractor.scala b/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/common/ConverterExtractor.scala index e6794de3b2..7799761a37 100644 --- a/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/common/ConverterExtractor.scala +++ b/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/common/ConverterExtractor.scala @@ -35,7 +35,7 @@ trait ConverterExtractor[Original <: AmfObject, Result <: AmfObject] newName, params.bu, params.uri, - params.definedBy, + params.documentDefinition, params.configuration, jsonOptions, yamlOptions, diff --git a/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/common/DeclarationWrapper.scala b/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/common/DeclarationWrapper.scala index b80efc7e2d..f01e15920c 100644 --- a/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/common/DeclarationWrapper.scala +++ b/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/common/DeclarationWrapper.scala @@ -1,6 +1,5 @@ package org.mulesoft.als.actions.codeactions.plugins.declarations.common -import amf.aml.client.scala.model.document.Dialect import amf.core.client.scala.model.document.BaseUnit import amf.core.client.scala.model.domain.AmfObject import org.mulesoft.als.actions.codeactions.plugins.declarations.common.ExtractorCommon.{ @@ -9,7 +8,7 @@ import org.mulesoft.als.actions.codeactions.plugins.declarations.common.Extracto } import org.mulesoft.als.common.YPartASTWrapper.YNodeImplicits import org.mulesoft.als.configuration.AlsConfigurationReader -import org.mulesoft.amfintegration.amfconfiguration.ALSConfigurationState +import org.mulesoft.amfintegration.amfconfiguration.{ALSConfigurationState, DocumentDefinition} import org.yaml.model.YMapEntry import org.yaml.render.{JsonRenderOptions, YamlRenderOptions} @@ -18,18 +17,18 @@ trait DeclarationWrapper { val declarationKey: String def wrapDeclaration( - amfObject: Option[AmfObject], - newName: String, - bu: BaseUnit, - uri: String, - dialect: Dialect, - configurationReader: AlsConfigurationReader, - jsonOptions: JsonRenderOptions, - yamlOptions: YamlRenderOptions, - alsConfigurationState: ALSConfigurationState + amfObject: Option[AmfObject], + newName: String, + bu: BaseUnit, + uri: String, + documentDefinition: DocumentDefinition, + configurationReader: AlsConfigurationReader, + jsonOptions: JsonRenderOptions, + yamlOptions: YamlRenderOptions, + alsConfigurationState: ALSConfigurationState ): Option[(String, Option[YMapEntry])] = { val existingDeclaration = ExtractorCommon.findExistingKeyPart(bu, uri, Seq(declarationKey)) - declaredElementNode(amfObject, dialect, alsConfigurationState) + declaredElementNode(amfObject, documentDefinition, alsConfigurationState) .map(node => { val r = node.withKey(newName) if (existingDeclaration.isEmpty) r.withKey(declarationKey) else r diff --git a/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/common/ExtractorCommon.scala b/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/common/ExtractorCommon.scala index f9a5454796..abcdfd8439 100644 --- a/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/common/ExtractorCommon.scala +++ b/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/common/ExtractorCommon.scala @@ -11,7 +11,7 @@ import org.mulesoft.als.common.dtoTypes.PositionRange import org.mulesoft.als.configuration.AlsConfigurationReader import org.mulesoft.als.declarations.DeclarationCreator import org.mulesoft.amfintegration.AmfImplicits.{AmfAnnotationsImp, AmfObjectImp, BaseUnitImp} -import org.mulesoft.amfintegration.amfconfiguration.ALSConfigurationState +import org.mulesoft.amfintegration.amfconfiguration.{ALSConfigurationState, DocumentDefinition} import org.mulesoft.common.collections._ import org.yaml.model._ import org.yaml.render.{JsonRender, JsonRenderOptions, YamlRender, YamlRenderOptions} @@ -22,17 +22,17 @@ object ExtractorCommon extends DeclarationCreator { !bu.declarations.forall(objs.contains) def existAnyDeclaration( - objs: Seq[AmfObject], - astPartBranch: Option[ASTPartBranch], - bu: BaseUnit, - dialect: Dialect + objs: Seq[AmfObject], + astPartBranch: Option[ASTPartBranch], + bu: BaseUnit, + documentDefinition: DocumentDefinition ): Seq[PositionRange] = if (!existAnyOtherDeclaration(objs, bu)) - deleteAll(objs, astPartBranch, bu, dialect) - else deleteDeclarationGroup(objs, bu, dialect) + deleteAll(objs, astPartBranch, bu, documentDefinition) + else deleteDeclarationGroup(objs, bu, documentDefinition) - private def deleteAll(objs: Seq[AmfObject], astPartBranch: Option[ASTPartBranch], bu: BaseUnit, dialect: Dialect) = - declarationPathForDialect(dialect) match { + private def deleteAll(objs: Seq[AmfObject], astPartBranch: Option[ASTPartBranch], bu: BaseUnit, documentDefinition: DocumentDefinition) = + declarationPathForDialect(documentDefinition) match { case Some(d) => val flatten: Option[YMapEntry] = astPartBranch .map(_.stack) @@ -41,11 +41,11 @@ object ExtractorCommon extends DeclarationCreator { .collectFirst({ case m: YMap => m.entries.find(_.key.asScalar.exists(_.text == d)) }) .flatten flatten.map(_.range).map(PositionRange(_)).toSeq - case _ => deleteDeclarationGroup(objs, bu, dialect) + case _ => deleteDeclarationGroup(objs, bu, documentDefinition) } - private def deleteDeclarationGroup(objs: Seq[AmfObject], bu: BaseUnit, dialect: Dialect): Seq[PositionRange] = { - val objsByKey: Map[Option[String], Seq[AmfObject]] = objs.legacyGroupBy(_.declarableKey(dialect)) + private def deleteDeclarationGroup(objs: Seq[AmfObject], bu: BaseUnit, documentDefinition: DocumentDefinition): Seq[PositionRange] = { + val objsByKey: Map[Option[String], Seq[AmfObject]] = objs.legacyGroupBy(_.declarableKey(documentDefinition)) val allRanges = if (!objsByKey.keySet.contains(None)) objsByKey.iterator.flatMap { t => @@ -69,20 +69,20 @@ object ExtractorCommon extends DeclarationCreator { * Element as YNode */ def declaredElementNode( - amfObject: Option[AmfObject], - dialect: Dialect, - alsConfigurationState: ALSConfigurationState + amfObject: Option[AmfObject], + documentDefinition: DocumentDefinition, + alsConfigurationState: ALSConfigurationState ): Option[YNode] = amfObject .collect { case e: DomainElement => - alsConfigurationState.configForDialect(dialect).emit(e) + alsConfigurationState.configForDefinition(documentDefinition).emit(e) } /** The complete node and the entry where it belongs, contemplating the path for the declaration and existing AST */ def wrappedDeclaredEntry( amfObject: Option[AmfObject], - dialect: Dialect, + dialect: DocumentDefinition, bu: BaseUnit, uri: String, newName: String, @@ -103,17 +103,17 @@ object ExtractorCommon extends DeclarationCreator { /** Render for the new declaration, and the top entry on which it should be nested */ def declaredEntry( - amfObject: Option[AmfObject], - dialect: Dialect, - bu: BaseUnit, - uri: String, - newName: String, - configurationReader: AlsConfigurationReader, - jsonOptions: JsonRenderOptions, - yamlOptions: YamlRenderOptions, - alsConfigurationState: ALSConfigurationState + amfObject: Option[AmfObject], + documentDefinition: DocumentDefinition, + bu: BaseUnit, + uri: String, + newName: String, + configurationReader: AlsConfigurationReader, + jsonOptions: JsonRenderOptions, + yamlOptions: YamlRenderOptions, + alsConfigurationState: ALSConfigurationState ): Option[(String, Option[YMapEntry])] = { - val wrapped = wrappedDeclaredEntry(amfObject, dialect, bu, uri, newName, alsConfigurationState) + val wrapped = wrappedDeclaredEntry(amfObject, documentDefinition, bu, uri, newName, alsConfigurationState) val maybeParent: Option[YMapEntry] = wrapped.flatMap(_._2) wrapped .map(_._1) diff --git a/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/delete/DeleteDeclaredNodeCodeAction.scala b/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/delete/DeleteDeclaredNodeCodeAction.scala index 1e9b72a533..f39b5c6d2d 100644 --- a/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/delete/DeleteDeclaredNodeCodeAction.scala +++ b/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/delete/DeleteDeclaredNodeCodeAction.scala @@ -70,7 +70,7 @@ class DeleteDeclaredNodeCodeAction(override val params: CodeActionRequestParams) private def removeObj(obj: AmfObject) = ExtractorCommon - .existAnyDeclaration(Seq(obj), yPartBranch, params.bu, params.definedBy) + .existAnyDeclaration(Seq(obj), yPartBranch, params.bu, params.documentDefinition) .map(toLspRange) .map(r => TextEdit(r.copy(start = r.start.copy(character = 0)), "")) .headOption diff --git a/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/fragment/ExtractRamlDeclarationToFragmentCodeAction.scala b/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/fragment/ExtractRamlDeclarationToFragmentCodeAction.scala index 9f7fec8827..788f75fee3 100644 --- a/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/fragment/ExtractRamlDeclarationToFragmentCodeAction.scala +++ b/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/fragment/ExtractRamlDeclarationToFragmentCodeAction.scala @@ -27,7 +27,7 @@ case class ExtractRamlDeclarationToFragmentCodeAction(params: CodeActionRequestP override protected val kindTitle: CodeActionKindTitle = ExtractRamlTypeToFragmentCodeAction override lazy val amfObject: Option[AmfObject] = { - val maybeObject = extractAmfObject(maybeTree, params.definedBy) + val maybeObject = extractAmfObject(maybeTree, params.documentDefinition) fragmentBundleForObject(maybeObject).fold { // if empty maybeTree.flatMap(t => t.stack.headOption).collect { case d: CustomDomainProperty => d // declared annotation type diff --git a/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/fragment/ExtractRamlTypeToFragmentCodeAction.scala b/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/fragment/ExtractRamlTypeToFragmentCodeAction.scala index b6c51299eb..942a6380a9 100644 --- a/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/fragment/ExtractRamlTypeToFragmentCodeAction.scala +++ b/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/fragment/ExtractRamlTypeToFragmentCodeAction.scala @@ -29,7 +29,7 @@ case class ExtractRamlTypeToFragmentCodeAction(params: CodeActionRequestParams) spec.isRaml && positionIsExtracted && amfObject.exists(o => ExtractorCommon - .declarationPath(o, params.alsConfigurationState.definitionFor(spec).getOrElse(params.definedBy)) == Seq( + .declarationPath(o, params.alsConfigurationState.definitionFor(spec).getOrElse(params.documentDefinition)) == Seq( "types" ) ) diff --git a/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/library/ExtractDeclarationsToLibrary.scala b/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/library/ExtractDeclarationsToLibrary.scala index 4c4fb08363..395606fe19 100644 --- a/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/library/ExtractDeclarationsToLibrary.scala +++ b/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/library/ExtractDeclarationsToLibrary.scala @@ -146,7 +146,7 @@ trait ExtractDeclarationsToLibrary extends CodeActionResponsePlugin with Creates .map(_.start) .map(p => params.astPartBranchCached.getCachedOrNew(p, params.uri)), params.bu, - params.definedBy + params.documentDefinition ) // as it is just for RAML (ergo YAML), we will take the whole line as the entry to be erased .map(range => Range(Position(range.start.line, 0), LspRangeConverter.toLspPosition(range.`end`))) diff --git a/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/samefile/ExtractElementCodeAction.scala b/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/samefile/ExtractElementCodeAction.scala index 4046a0df6b..137800e993 100644 --- a/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/samefile/ExtractElementCodeAction.scala +++ b/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/samefile/ExtractElementCodeAction.scala @@ -18,7 +18,7 @@ case class ExtractElementCodeAction(params: CodeActionRequestParams) extends Ext override lazy val isApplicable: Boolean = homogeneousVendor && !spec.isRaml && amfObject.isDefined && positionIsExtracted && - params.definedBy != MetaDialect.dialect && appliesToDocument() + params.documentDefinition.baseUnit != MetaDialect.dialect && appliesToDocument() override protected def msg(params: CodeActionRequestParams): String = s"Extract element to declaration: \n\t${params.uri}\t${params.range}" diff --git a/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/samefile/ExtractRamlTypeCodeAction.scala b/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/samefile/ExtractRamlTypeCodeAction.scala index 61b7a1124d..e71b5959bf 100644 --- a/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/samefile/ExtractRamlTypeCodeAction.scala +++ b/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/samefile/ExtractRamlTypeCodeAction.scala @@ -24,7 +24,7 @@ case class ExtractRamlTypeCodeAction(params: CodeActionRequestParams) override lazy val isApplicable: Boolean = homogeneousVendor && spec.isRaml && positionIsExtracted && - amfObject.exists(o => ExtractorCommon.declarationPath(o, params.definedBy) == Seq("types")) && appliesToDocument() + amfObject.exists(o => ExtractorCommon.declarationPath(o, params.documentDefinition) == Seq("types")) && appliesToDocument() override lazy val linkEntry: Future[Option[TextEdit]] = renderLink.map( diff --git a/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/samefile/ExtractSameFileDeclaration.scala b/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/samefile/ExtractSameFileDeclaration.scala index 96ec4d8759..e45c4294aa 100644 --- a/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/samefile/ExtractSameFileDeclaration.scala +++ b/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/samefile/ExtractSameFileDeclaration.scala @@ -39,7 +39,7 @@ trait ExtractSameFileDeclaration extends CodeActionResponsePlugin with ShapeExtr protected def appliesToDocument(): Boolean = !params.bu.isFragment || params.bu - .documentMapping(params.definedBy) + .documentMapping(params.documentDefinition) .exists(_.declaredNodes().exists(dn => amfObject.exists(_.id == dn.mappedNode().value()))) protected lazy val declaredElementTextEdit: Option[TextEdit] = @@ -52,7 +52,7 @@ trait ExtractSameFileDeclaration extends CodeActionResponsePlugin with ShapeExtr ExtractorCommon .declaredEntry( amfObject, - params.definedBy, + params.documentDefinition, params.bu, params.uri, name, @@ -85,7 +85,7 @@ trait ExtractSameFileDeclaration extends CodeActionResponsePlugin with ShapeExtr l.annotations += DeclaredElement() val linkDe: DomainElement = l.link(newName) linkDe.annotations += ForceEntry() // raml explicit types - params.alsConfigurationState.configForDialect(params.definedBy).emit(linkDe) + params.alsConfigurationState.configForDefinition(params.documentDefinition).emit(linkDe) } } diff --git a/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/trait/ExtractTraitCodeAction.scala b/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/trait/ExtractTraitCodeAction.scala index 05bc983ea3..5167b41014 100644 --- a/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/trait/ExtractTraitCodeAction.scala +++ b/als-actions/shared/src/main/scala/org/mulesoft/als/actions/codeactions/plugins/declarations/trait/ExtractTraitCodeAction.scala @@ -52,7 +52,7 @@ class ExtractTraitCodeAction(override protected val params: CodeActionRequestPar val newExtends: Seq[DomainElement] = Seq(ParametrizedTrait().withName(newName)) result.withExtends(newExtends) - val node = params.alsConfigurationState.configForDialect(params.definedBy).emit(result) + val node = params.alsConfigurationState.configForDefinition(params.documentDefinition).emit(result) s"\n${renderNode(node, yPartBranch.flatMap(_.closestEntry))}\n" } diff --git a/als-actions/shared/src/main/scala/org/mulesoft/als/actions/hover/HoverAction.scala b/als-actions/shared/src/main/scala/org/mulesoft/als/actions/hover/HoverAction.scala index 11c36935f3..4496baefdd 100644 --- a/als-actions/shared/src/main/scala/org/mulesoft/als/actions/hover/HoverAction.scala +++ b/als-actions/shared/src/main/scala/org/mulesoft/als/actions/hover/HoverAction.scala @@ -13,6 +13,7 @@ import org.mulesoft.als.common.cache.{ASTPartBranchCached, ObjectInTreeCached} import org.mulesoft.als.common.dtoTypes.{Position, PositionRange} import org.mulesoft.als.convert.LspRangeConverter import org.mulesoft.amfintegration.AmfImplicits._ +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition import org.mulesoft.amfintegration.vocabularies.AmlCoreVocabulary import org.mulesoft.amfintegration.vocabularies.integration.VocabularyProvider import org.mulesoft.amfintegration.vocabularies.propertyterms.NamePropertyTerm @@ -20,13 +21,13 @@ import org.mulesoft.lsp.feature.hover.Hover import org.yaml.model.YMapEntry case class HoverAction( - bu: BaseUnit, - tree: ObjectInTreeCached, - astPartBranchCached: ASTPartBranchCached, - dtoPosition: Position, - location: String, - provider: VocabularyProvider, - definedBy: Dialect + bu: BaseUnit, + tree: ObjectInTreeCached, + astPartBranchCached: ASTPartBranchCached, + dtoPosition: Position, + location: String, + provider: VocabularyProvider, + documentDefinition: DocumentDefinition ) { private val objectInTree: ObjectInTree = tree.getCachedOrNew(dtoPosition, location) @@ -113,7 +114,7 @@ case class HoverAction( } private def getDeclarationValueType(entry: YMapEntry): Option[ValueType] = - definedBy.declarationsMapTerms + documentDefinition.declarationsMapTerms .find(_._2 == entry.key.value.toString) .map(a => { ValueType(a._1) @@ -144,10 +145,10 @@ case class HoverAction( }) def getPatchedHover: Option[(Seq[String], Option[AmfPositionRange])] = - patchedHover.getHover(objectInTree.obj, yPartBranch, definedBy) + patchedHover.getHover(objectInTree.obj, yPartBranch, documentDefinition) private lazy val patchedHover = - PatchedHover(provider, Seq(DialectTerms(bu, definedBy))) + PatchedHover(provider, Seq(DocumentTerms(bu, documentDefinition))) } -sealed case class DialectTerms(bu: BaseUnit, definedBy: Dialect) +sealed case class DocumentTerms(bu: BaseUnit, documentDefinition: DocumentDefinition) diff --git a/als-actions/shared/src/main/scala/org/mulesoft/als/actions/hover/PatchedHover.scala b/als-actions/shared/src/main/scala/org/mulesoft/als/actions/hover/PatchedHover.scala index ef1b01c7ff..db13777afc 100644 --- a/als-actions/shared/src/main/scala/org/mulesoft/als/actions/hover/PatchedHover.scala +++ b/als-actions/shared/src/main/scala/org/mulesoft/als/actions/hover/PatchedHover.scala @@ -1,13 +1,12 @@ package org.mulesoft.als.actions.hover -import amf.aml.client.scala.model.document.Dialect import amf.aml.client.scala.model.domain.ClassTerm -import org.mulesoft.common.client.lexical.{PositionRange => AmfPositionRange} import amf.core.client.scala.model.domain.AmfObject import amf.core.client.scala.vocabulary.ValueType import amf.core.internal.annotations.Aliases -import org.mulesoft.als.common.{ASTPartBranch, YPartBranch} +import org.mulesoft.als.common.ASTPartBranch import org.mulesoft.amfintegration.AmfImplicits.AmfObjectImp +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition import org.mulesoft.amfintegration.dialect.dialects.asyncapi20.AsyncApi20Dialect import org.mulesoft.amfintegration.dialect.dialects.asyncapi26.AsyncApi26Dialect import org.mulesoft.amfintegration.dialect.dialects.oas.{OAS20Dialect, OAS30Dialect} @@ -16,6 +15,7 @@ import org.mulesoft.amfintegration.dialect.dialects.raml.raml10.Raml10TypesDiale import org.mulesoft.amfintegration.vocabularies.AlsPatchedVocabulary import org.mulesoft.amfintegration.vocabularies.integration.{AlsVocabularyRegistry, VocabularyProvider} import org.mulesoft.amfintegration.vocabularies.propertyterms.patched.raml.raml10.Raml10UsesKeyTerm +import org.mulesoft.common.client.lexical.{PositionRange => AmfPositionRange} import org.yaml.model.YMapEntry class PatchedHover private (provider: VocabularyProvider) { @@ -31,13 +31,13 @@ class PatchedHover private (provider: VocabularyProvider) { ) def getHover( - obj: AmfObject, - branch: ASTPartBranch, - dialect: Dialect + obj: AmfObject, + branch: ASTPartBranch, + documentDefinition: DocumentDefinition ): Option[(Seq[String], Option[AmfPositionRange])] = obj.metaURIs.headOption.flatMap(metaUri => { branch.closestEntry match { - case Some(entry: YMapEntry) => getPatchedHover(metaUri, entry, dialect.id) + case Some(entry: YMapEntry) => getPatchedHover(metaUri, entry, documentDefinition.baseUnit.id) case _ => None } @@ -82,22 +82,22 @@ class PatchedHover private (provider: VocabularyProvider) { indexAliasTerms(aliases, dialectName) } - private def init(dialect: Dialect, aliases: Aliases): Unit = { - patches(dialectNames.getOrElse(dialect.id, "unknown"), aliases) + private def init(documentDefinition: DocumentDefinition, aliases: Aliases): Unit = { + patches(dialectNames.getOrElse(documentDefinition.baseUnit.id, "unknown"), aliases) } } object PatchedHover { - def apply(provider: VocabularyProvider, dialectTerms: Seq[DialectTerms]): PatchedHover = { + def apply(provider: VocabularyProvider, dialectTerms: Seq[DocumentTerms]): PatchedHover = { val ph = new PatchedHover(provider) provider match { case _: AlsVocabularyRegistry => dialectTerms.foreach(t => { t.bu.annotations .find(classOf[Aliases]) - .foreach(aliases => ph.init(t.definedBy, aliases)) + .foreach(aliases => ph.init(t.documentDefinition, aliases)) }) case _ => } diff --git a/als-actions/shared/src/test/scala/org/mulesoft/als/actions/HoverActionTest.scala b/als-actions/shared/src/test/scala/org/mulesoft/als/actions/HoverActionTest.scala index 65face6b8f..65a132483d 100644 --- a/als-actions/shared/src/test/scala/org/mulesoft/als/actions/HoverActionTest.scala +++ b/als-actions/shared/src/test/scala/org/mulesoft/als/actions/HoverActionTest.scala @@ -72,7 +72,7 @@ class HoverActionTest extends AsyncFunSuite with BaseHoverTest { val positions: List[Position] = r.result.baseUnit.ast.map(extract).getOrElse(List.empty) val yPart = new ASTPartBranchCached(r.result.baseUnit) val value = - r.definedBy // always is going to exists in this test and if not, the exception is an advice good enough. + r.documentDefinition // always is going to exists in this test and if not, the exception is an advice good enough. val cached = new ObjectInTreeCached(r.result.baseUnit, value) positions.map { p => val hover = diff --git a/als-actions/shared/src/test/scala/org/mulesoft/als/actions/codeactions/BaseCodeActionTests.scala b/als-actions/shared/src/test/scala/org/mulesoft/als/actions/codeactions/BaseCodeActionTests.scala index 5281b89dd1..63b2f366f1 100644 --- a/als-actions/shared/src/test/scala/org/mulesoft/als/actions/codeactions/BaseCodeActionTests.scala +++ b/als-actions/shared/src/test/scala/org/mulesoft/als/actions/codeactions/BaseCodeActionTests.scala @@ -8,12 +8,7 @@ import org.mulesoft.als.common.diff.FileAssertionTest import org.mulesoft.als.common.dtoTypes.PositionRange import org.mulesoft.als.common.{PlatformDirectoryResolver, WorkspaceEditSerializer} import org.mulesoft.als.configuration.AlsConfiguration -import org.mulesoft.amfintegration.amfconfiguration.{ - ALSConfigurationState, - AmfParseResult, - EditorConfiguration, - EmptyProjectConfigurationState -} +import org.mulesoft.amfintegration.amfconfiguration.{ALSConfigurationState, AmfParseResult, DocumentDefinition, EditorConfiguration, EmptyProjectConfigurationState} import org.mulesoft.amfintegration.relationships.RelationshipLink import org.mulesoft.amfintegration.visitors.AmfElementDefaultVisitors import org.mulesoft.lsp.edit.WorkspaceEdit @@ -112,7 +107,7 @@ trait BaseCodeActionTests extends AsyncFlatSpec with Matchers with FileAssertion cu.unit, cu.tree, cu.astPartBranch, - amfResult.definedBy, + amfResult.documentDefinition, AlsConfiguration(), relationShip, alsConfigurationState, @@ -126,10 +121,10 @@ trait BaseCodeActionTests extends AsyncFlatSpec with Matchers with FileAssertion .flatMap { af => val relativaf = relativeUri(af) amfResult.result.baseUnit.references.find(r => r.location().getOrElse(r.id) == relativaf).map { unit => - DummyCompilableUnit(unit, amfResult.definedBy) + DummyCompilableUnit(unit, amfResult.documentDefinition) } } - .getOrElse(DummyCompilableUnit(amfResult.result.baseUnit, amfResult.definedBy)) + .getOrElse(DummyCompilableUnit(amfResult.result.baseUnit, amfResult.documentDefinition)) } } protected def buildPreParam(uri: String, result: AmfParseResult): PreCodeActionRequestParams = { @@ -145,7 +140,7 @@ trait BaseCodeActionTests extends AsyncFlatSpec with Matchers with FileAssertion range: PositionRange, alsConfigurationState: ALSConfigurationState ): CodeActionRequestParams = { - val cu = DummyCompilableUnit(result.result.baseUnit, result.definedBy) + val cu = DummyCompilableUnit(result.result.baseUnit, result.documentDefinition) val visitors = AmfElementDefaultVisitors.build(cu.unit) visitors.applyAmfVisitors(cu.unit, alsConfigurationState.amfParseContext) val visitors1: Seq[RelationshipLink] = visitors.getRelationshipsFromVisitors @@ -155,7 +150,7 @@ trait BaseCodeActionTests extends AsyncFlatSpec with Matchers with FileAssertion cu.unit, cu.tree, cu.astPartBranch, - result.definedBy, + result.documentDefinition, AlsConfiguration(), visitors1, alsConfigurationState, @@ -165,4 +160,4 @@ trait BaseCodeActionTests extends AsyncFlatSpec with Matchers with FileAssertion } } -case class DummyCompilableUnit(unit: BaseUnit, override protected val definedBy: Dialect) extends UnitWithCaches +case class DummyCompilableUnit(unit: BaseUnit, override protected val documentDefinition: DocumentDefinition) extends UnitWithCaches diff --git a/als-common/shared/src/main/scala/org/mulesoft/als/common/AmfSonElementFinder.scala b/als-common/shared/src/main/scala/org/mulesoft/als/common/AmfSonElementFinder.scala index 0416a2f494..cdf5f01fa0 100644 --- a/als-common/shared/src/main/scala/org/mulesoft/als/common/AmfSonElementFinder.scala +++ b/als-common/shared/src/main/scala/org/mulesoft/als/common/AmfSonElementFinder.scala @@ -1,6 +1,5 @@ package org.mulesoft.als.common -import amf.aml.client.scala.model.document.Dialect import amf.aml.client.scala.model.domain.DialectDomainElement import amf.aml.internal.metamodel.domain.DialectDomainElementModel import amf.apicontract.client.scala.model.domain.Payload @@ -14,13 +13,8 @@ import amf.core.internal.parser.domain.FieldEntry import amf.shapes.internal.domain.metamodel.AnyShapeModel import org.mulesoft.als.common.ASTElementWrapper._ import org.mulesoft.als.common.AlsAmfElement._ -import org.mulesoft.amfintegration.AmfImplicits.{ - AmfAnnotationsImp, - AmfObjectImp, - DialectImplicits, - FieldEntryImplicit, - NodeMappingImplicit -} +import org.mulesoft.amfintegration.AmfImplicits.{AmfAnnotationsImp, AmfObjectImp, DialectImplicits, FieldEntryImplicit, NodeMappingImplicit} +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition import org.mulesoft.common.client.lexical.PositionRange import org.yaml.model.{YMap, YMapEntry} @@ -30,10 +24,10 @@ object AmfSonElementFinder { implicit class AlsAmfObject(obj: AmfObject) { - def findSon(location: String, definedBy: Dialect, astBranch: ASTPartBranch): SonFinder#Branch = - SonFinder(location, definedBy, astBranch: ASTPartBranch).find(obj, definedBy) + def findSon(location: String, documentDefinition: DocumentDefinition, astBranch: ASTPartBranch): SonFinder#Branch = + SonFinder(location, documentDefinition, astBranch: ASTPartBranch).find(obj, documentDefinition) - case class SonFinder(location: String, definedBy: Dialect, astBranch: ASTPartBranch) { + case class SonFinder(location: String, documentDefinition: DocumentDefinition, astBranch: ASTPartBranch) { private val fieldAstFilter: FieldEntry => Boolean = (f: FieldEntry) => f.value.annotations @@ -56,9 +50,9 @@ object AmfSonElementFinder { private def appliesReduction(fe: FieldEntry) = (!fe.value.annotations.isInferred) || fe.value.value.annotations.containsAstBranch(astBranch).getOrElse(false) - def find(obj: AmfObject, definedBy: Dialect): Branch = { + def find(obj: AmfObject, documentDefinition: DocumentDefinition): Branch = { val entryPoint = Branch(obj, Nil, None) - find(entryPoint, definedBy) match { + find(entryPoint, documentDefinition) match { case Nil => entryPoint case list => pickOne(filterCandidates(list)) @@ -98,10 +92,10 @@ object AmfSonElementFinder { } }) - private def find(branch: Branch, definedBy: Dialect): Seq[Branch] = { + private def find(branch: Branch, documentDefinition: DocumentDefinition): Seq[Branch] = { val children: Seq[Either[AmfObject, FieldEntry]] = filterFields(branch.obj).flatMap(fe => { - val seq = nextObject(fe, branch.obj, definedBy).map(Left(_)) + val seq = nextObject(fe, branch.obj, documentDefinition).map(Left(_)) if (seq.nonEmpty) seq else Seq(Right(fe)) }) @@ -110,7 +104,7 @@ object AmfSonElementFinder { children.flatMap { case Left(obj) => if (branch.branch.contains(obj)) Some(branch) - else find(branch.newLeaf(obj), definedBy) + else find(branch.newLeaf(obj), documentDefinition) case Right(fe) // todo: check this clause, it is a weird predicate if !fe.value.annotations.isInferred || fe.value.value.containsYPart(astBranch) => @@ -132,12 +126,12 @@ object AmfSonElementFinder { def forField(fe: FieldEntry): Branch = copy(fe = Some(fe)) } - private def nextObject(fe: FieldEntry, parent: AmfObject, definedBy: Dialect): Seq[AmfObject] = + private def nextObject(fe: FieldEntry, parent: AmfObject, documentDefinition: DocumentDefinition): Seq[AmfObject] = if (fe.objectSon && fe.value.value.location().forall(l => l.isEmpty || l == location)) fe.value.value match { case e: AmfArray => // todo: here "if e.containsYPart(yPartBranch)" is not possible because some tests depend on this matching incorrect nodes - val objects = nextObject(e, definedBy) + val objects = nextObject(e, documentDefinition) if (objects.isEmpty) buildFromMeta(parent, fe, e).toSeq else objects case o: AmfObject if o.containsYPart(astBranch) || o.annotations.isVirtual => @@ -148,25 +142,25 @@ object AmfSonElementFinder { else Seq.empty def buildFromMeta(parent: AmfObject, fe: FieldEntry, arr: AmfArray): Option[AmfObject] = - if (explicitArray(fe, parent, definedBy)) matchInnerArrayElement(fe, arr, definedBy, parent) + if (explicitArray(fe, parent, documentDefinition)) matchInnerArrayElement(fe, arr, documentDefinition, parent) else None /** @param amfObject - * @param definedBy + * @param documentDefinition * @return * true if this object should be filtered OUT */ - private def exceptionCase(amfObject: AmfObject, definedBy: Dialect): Boolean = - exceptionList.exists(_(amfObject, definedBy)) + private def exceptionCase(amfObject: AmfObject, documentDefinition: DocumentDefinition): Boolean = + exceptionList.exists(_(amfObject, documentDefinition)) - private val exceptionList: Seq[(AmfObject, Dialect) => Boolean] = Seq( + private val exceptionList: Seq[(AmfObject, DocumentDefinition) => Boolean] = Seq( exceptionAsyncPayload ) /** TODO: Remove and fix annotation of Async Payload in AMF */ - private def exceptionAsyncPayload(amfObject: AmfObject, definedBy: Dialect): Boolean = amfObject match { - case p: Payload if definedBy.nameAndVersion() == "asyncapi 2.0.0" => + private def exceptionAsyncPayload(amfObject: AmfObject, documentDefinition: DocumentDefinition): Boolean = amfObject match { + case p: Payload if documentDefinition.nameAndVersion() == "asyncapi 2.0.0" => val correctAstContains = p.annotations .astElement() .flatMap { @@ -183,7 +177,7 @@ object AmfSonElementFinder { case _ => false } - def nextObject(array: AmfArray, definedBy: Dialect): Seq[AmfObject] = + def nextObject(array: AmfArray, documentDefinition: DocumentDefinition): Seq[AmfObject] = // if (array.containsYPart(yPartBranch)) { // todo: this array comparison is rancid, we should see why the containsYPart is not sufficient // (why we expect a virtual/synthetized to always match even if no element inside does) @@ -191,7 +185,7 @@ object AmfSonElementFinder { val objects = array.values.collect({ case o: AmfObject => o }) val candidates = objects .filter(_.containsYPart(astBranch)) - .filterNot(exceptionCase(_, definedBy)) + .filterNot(exceptionCase(_, documentDefinition)) if (candidates.isEmpty) objects.filter(v => (v.annotations.isVirtual && v.annotations @@ -213,19 +207,19 @@ object AmfSonElementFinder { def filterFields(amfObject: AmfObject): Seq[FieldEntry] = amfObject.fields.fields().filter(f => fieldFilters.forall(fn => fn(f))).toSeq - private def explicitArray(entry: FieldEntry, parent: AmfObject, definedBy: Dialect) = - (entry.astValueArray() && isExplicitArray(entry, parent, definedBy) || !entry + private def explicitArray(entry: FieldEntry, parent: AmfObject, documentDefinition: DocumentDefinition) = + (entry.astValueArray() && isExplicitArray(entry, parent, documentDefinition) || !entry .astValueArray()) && astBranch.position.column > 0 // TODO: Check why this hack (pos > 0) is necessary - private def isExplicitArray(entry: FieldEntry, parent: AmfObject, definedBy: Dialect) = - definedBy + private def isExplicitArray(entry: FieldEntry, parent: AmfObject, documentDefinition: DocumentDefinition) = + documentDefinition .findNodeMappingByTerm(parent.meta.`type`.head.iri()) .flatMap { nm => nm.findPropertyByTerm(entry.field.value.iri()) } .exists(p => p.allowMultiple().value()) - private def matchInnerArrayElement(entry: FieldEntry, e: AmfArray, definedBy: Dialect, parent: AmfObject) = + private def matchInnerArrayElement(entry: FieldEntry, e: AmfArray, documentDefinition: DocumentDefinition, parent: AmfObject) = entry.field.`type`.asInstanceOf[ArrayLike].element match { case d: DialectDomainElementModel => val maybeMapping = parent match { @@ -238,7 +232,7 @@ object AmfSonElementFinder { maybeMapping .flatMap(_.objectRange().headOption) .flatMap(_.option()) - .flatMap(definedBy.findNodeMapping) + .flatMap(documentDefinition.findNodeMapping) .map { nodeMapping => DialectDomainElement() .withInstanceTypes(nodeMapping.nodetypeMapping.value() +: d.`type`.map(_.iri())) diff --git a/als-common/shared/src/main/scala/org/mulesoft/als/common/ObjectInTree.scala b/als-common/shared/src/main/scala/org/mulesoft/als/common/ObjectInTree.scala index 79d60e24d9..24edfd1661 100644 --- a/als-common/shared/src/main/scala/org/mulesoft/als/common/ObjectInTree.scala +++ b/als-common/shared/src/main/scala/org/mulesoft/als/common/ObjectInTree.scala @@ -9,12 +9,13 @@ import amf.core.internal.annotations.{DeclaredElement, DefinedBySpec, SourceYPar import amf.core.internal.metamodel.domain.LinkableElementModel import amf.core.internal.parser.domain.{Annotations, FieldEntry} import amf.core.internal.remote.{AmlDialectSpec, Spec} -import amf.shapes.internal.annotations.AVROSchemaType -import org.mulesoft.als.common.YPartASTWrapper.AlsYPart +import amf.shapes.client.scala.model.document.JsonLDInstanceDocument import org.mulesoft.als.common.AmfSonElementFinder.AlsAmfObject +import org.mulesoft.als.common.YPartASTWrapper.AlsYPart import org.mulesoft.als.common.dtoTypes.{Position, PositionRange} import org.mulesoft.amfintegration.AmfImplicits.AmfAnnotationsImp import org.mulesoft.amfintegration.FieldEntryOrdering +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition import org.yaml.model.YMapEntry case class ObjectInTree( @@ -104,20 +105,27 @@ case class ObjectInTree( object ObjectInTreeBuilder { - def fromUnit(bu: BaseUnit, location: String, definedBy: Dialect, astBranch: ASTPartBranch): ObjectInTree = { + def fromUnit(bu: BaseUnit, location: String, documentDefinition: DocumentDefinition, astBranch: ASTPartBranch): ObjectInTree = { + val obj: AmfObject = bu match { + case json: JsonLDInstanceDocument => + json.encodes.collectFirst{case amfObject: AmfObject => amfObject} + .getOrElse(bu) // todo: this won't work for the finding but better than an exception, check how to handle it better in the future + case _ => bu + } + val branch = - bu.findSon(location, definedBy, astBranch) + obj.findSon(location, documentDefinition, astBranch) ObjectInTree(branch.obj, branch.branch, branch.fe, astBranch) } def fromSubTree( - element: DomainElement, - location: String, - previousStack: Seq[AmfObject], - definedBy: Dialect, - astPartBranch: ASTPartBranch + element: DomainElement, + location: String, + previousStack: Seq[AmfObject], + documentDefinition: DocumentDefinition, + astPartBranch: ASTPartBranch ): ObjectInTree = { - val branch = element.findSon(location, definedBy, astPartBranch) + val branch = element.findSon(location, documentDefinition, astPartBranch) ObjectInTree(branch.obj, branch.branch ++ previousStack, branch.fe, astPartBranch) } } diff --git a/als-common/shared/src/main/scala/org/mulesoft/als/common/cache/BaseUnitCachedElement.scala b/als-common/shared/src/main/scala/org/mulesoft/als/common/cache/BaseUnitCachedElement.scala index d6f4a12f59..66168dd550 100644 --- a/als-common/shared/src/main/scala/org/mulesoft/als/common/cache/BaseUnitCachedElement.scala +++ b/als-common/shared/src/main/scala/org/mulesoft/als/common/cache/BaseUnitCachedElement.scala @@ -4,14 +4,8 @@ import amf.aml.client.scala.model.document.Dialect import amf.core.client.scala.model.document.BaseUnit import amf.core.internal.remote.Spec.GRAPHQL import org.mulesoft.als.common.dtoTypes.{Position, PositionRange} -import org.mulesoft.als.common.{ - ASTElementPartBranch, - ASTPartBranch, - NodeBranchBuilder, - ObjectInTree, - ObjectInTreeBuilder, - YPartBranch -} +import org.mulesoft.als.common.{ASTElementPartBranch, ASTPartBranch, NodeBranchBuilder, ObjectInTree, ObjectInTreeBuilder, YPartBranch} +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition import scala.collection.mutable @@ -39,13 +33,13 @@ trait BaseUnitCachedElement[T] { case class Location(position: Position, uri: String) -class ObjectInTreeCached(override val unit: BaseUnit, val definedBy: Dialect) +class ObjectInTreeCached(override val unit: BaseUnit, val documentDefinition: DocumentDefinition) extends BaseUnitCachedElement[ObjectInTree] { override protected def createElement(location: Location): ObjectInTree = ObjectInTreeBuilder.fromUnit( unit, location.uri, - definedBy, + documentDefinition, NodeBranchBuilder.build(unit, location.position.toAmfPosition, strict = false) ) @@ -66,7 +60,7 @@ class ASTPartBranchCached(override val unit: BaseUnit) extends BaseUnitCachedEle trait UnitWithCaches { protected val unit: BaseUnit - protected val definedBy: Dialect - val tree = new ObjectInTreeCached(unit, definedBy) + protected val documentDefinition: DocumentDefinition + val tree = new ObjectInTreeCached(unit, documentDefinition) val astPartBranch = new ASTPartBranchCached(unit) } diff --git a/als-common/shared/src/main/scala/org/mulesoft/als/configuration/Configuration.scala b/als-common/shared/src/main/scala/org/mulesoft/als/configuration/Configuration.scala index 1f963fb130..a01ca22083 100644 --- a/als-common/shared/src/main/scala/org/mulesoft/als/configuration/Configuration.scala +++ b/als-common/shared/src/main/scala/org/mulesoft/als/configuration/Configuration.scala @@ -1,9 +1,9 @@ package org.mulesoft.als.configuration -import org.mulesoft.amfintegration.dialect.integration.BaseAlsDialectProvider +import org.mulesoft.amfintegration.dialect.integration.BaseAlsDefinitionsProvider // todo: obsolete? object Configuration { - val internalDialects: Set[String] = Set("http://a.ml/dialects/profile.raml") ++ BaseAlsDialectProvider.allBaseDialects - .map(_.id) + val internalDialects: Set[String] = Set("http://a.ml/dialects/profile.raml") ++ BaseAlsDefinitionsProvider.allBaseDefinitions + .map(_.baseUnit.id) } diff --git a/als-common/shared/src/main/scala/org/mulesoft/als/declarations/DeclarationCreator.scala b/als-common/shared/src/main/scala/org/mulesoft/als/declarations/DeclarationCreator.scala index c659ee17a1..e1537d8b35 100644 --- a/als-common/shared/src/main/scala/org/mulesoft/als/declarations/DeclarationCreator.scala +++ b/als-common/shared/src/main/scala/org/mulesoft/als/declarations/DeclarationCreator.scala @@ -1,6 +1,5 @@ package org.mulesoft.als.declarations -import amf.aml.client.scala.model.document.Dialect import amf.apicontract.internal.metamodel.domain.api.BaseApiModel import amf.core.client.scala.model.document.{BaseUnit, EncodesModel, Module} import amf.core.client.scala.model.domain.AmfObject @@ -9,6 +8,7 @@ import amf.core.internal.utils.InflectorBase.Inflector import org.mulesoft.als.common.NodeBranchBuilder import org.mulesoft.als.common.dtoTypes.{Position, PositionRange} import org.mulesoft.amfintegration.AmfImplicits.{AmfAnnotationsImp, AmfObjectImp, BaseUnitImp} +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition import org.mulesoft.common.client.lexical.ASTElement import org.yaml.model._ @@ -16,17 +16,17 @@ import scala.annotation.tailrec trait DeclarationCreator { - def declarationName(amfObject: AmfObject, dialect: Dialect): Option[String] = + def declarationName(amfObject: AmfObject, documentDefinition: DocumentDefinition): Option[String] = amfObject - .declarableKey(dialect) + .declarableKey(documentDefinition) .map(_.singularize) .map(t => s"new$t") - def declarationPath(fdp: AmfObject, dialect: Dialect): Seq[String] = - Seq(fdp.declarableKey(dialect), declarationPathForDialect(dialect)).flatten + def declarationPath(fdp: AmfObject, documentDefinition: DocumentDefinition): Seq[String] = + Seq(fdp.declarableKey(documentDefinition), declarationPathForDialect(documentDefinition)).flatten - def declarationPathForDialect(dialect: Dialect): Option[String] = - dialect.documents().declarationsPath().option() + def declarationPathForDialect(documentDefinition: DocumentDefinition): Option[String] = + documentDefinition.documents().flatMap(_.declarationsPath().option()) def findExistingKeyPart(bu: BaseUnit, uri: String, keyPath: Seq[String]): Seq[YMapEntry] = { val maybePart = bu.references diff --git a/als-common/shared/src/main/scala/org/mulesoft/amfintegration/AbstractDeclarationInformation.scala b/als-common/shared/src/main/scala/org/mulesoft/amfintegration/AbstractDeclarationInformation.scala index 5d68be081e..044e325b71 100644 --- a/als-common/shared/src/main/scala/org/mulesoft/amfintegration/AbstractDeclarationInformation.scala +++ b/als-common/shared/src/main/scala/org/mulesoft/amfintegration/AbstractDeclarationInformation.scala @@ -10,6 +10,7 @@ import amf.core.client.scala.model.document.BaseUnit import amf.core.client.scala.model.domain.DomainElement import amf.core.client.scala.model.domain.templates.AbstractDeclaration import amf.core.internal.annotations.SourceYPart +import amf.shapes.client.scala.ShapesConfiguration import org.mulesoft.als.logger.Logger import org.mulesoft.amfintegration.AmfImplicits._ import org.mulesoft.amfintegration.amfconfiguration.ProfileMatcher.profile @@ -34,7 +35,7 @@ object AbstractDeclarationInformation { def extractInformation( declaration: AbstractDeclaration, bu: BaseUnit, - amfConfiguration: AMFConfiguration + amfConfiguration: ShapesConfiguration ): Option[ElementInfo] = { getTarget(declaration) match { case r: ResourceType => diff --git a/als-common/shared/src/main/scala/org/mulesoft/amfintegration/AmfImplicits.scala b/als-common/shared/src/main/scala/org/mulesoft/amfintegration/AmfImplicits.scala index d062185703..0d6191849d 100644 --- a/als-common/shared/src/main/scala/org/mulesoft/amfintegration/AmfImplicits.scala +++ b/als-common/shared/src/main/scala/org/mulesoft/amfintegration/AmfImplicits.scala @@ -17,11 +17,13 @@ import amf.core.internal.parser.domain.{Annotations, FieldEntry, Value} import amf.core.internal.remote.Spec import amf.custom.validation.internal.report.loaders.ProfileDialectLoader import amf.plugins.document.vocabularies.plugin.ReferenceStyles +import amf.shapes.client.scala.model.document.JsonLDInstanceDocument import amf.shapes.internal.annotations._ import org.mulesoft.als.common.ASTElementWrapper._ import org.mulesoft.als.common.YPartASTWrapper.{AlsYMapOps, AlsYPart} import org.mulesoft.als.common.dtoTypes.{Position, PositionRange} import org.mulesoft.als.common.{ASTElementWrapper, ASTPartBranch} +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition import org.mulesoft.antlrast.ast.Node import org.mulesoft.common.client.lexical.{ASTElement, Position => AmfPosition, PositionRange => AmfPositionRange} import org.yaml.model._ @@ -223,9 +225,9 @@ object AmfImplicits { } implicit class AmfObjectImp(amfObject: AmfObject) { - def declarableKey(dialect: Dialect): Option[String] = + def declarableKey(documentDefinition: DocumentDefinition): Option[String] = amfObject.metaURIs - .flatMap(dialect.declarationsMapTerms.get(_)) + .flatMap(documentDefinition.declarationsMapTerms.get(_)) .headOption def metaURIs: List[String] = amfObject.meta.`type` match { @@ -264,6 +266,10 @@ object AmfImplicits { .map(_ => bu) .orElse( bu match { + case json: JsonLDInstanceDocument => + json.encodes.headOption.collect{ + case e: AmfObject => e // todo: all seems super dangerous, check if AMF has a prettier way of organizing this + } case e: EncodesModel if e.encodes.annotations.yPart().isDefined => Some(e.encodes) case _ => None @@ -337,14 +343,14 @@ object AmfImplicits { }) .getOrElse(0) - def documentMapping(dialect: Dialect): Option[DocumentMapping] = bu match { - case fragment: Fragment => documentForFragment(fragment, dialect) - case d: Document if d.root.value() => Some(dialect.documents().root()) + def documentMapping(documentDefinition: DocumentDefinition): Option[DocumentMapping] = bu match { + case fragment: Fragment => documentForFragment(fragment, documentDefinition) + case d: Document if d.root.value() => documentDefinition.documents().map(_.root()) case _ => None } - private def documentForFragment(fragment: Fragment, dialect: Dialect): Option[DocumentMapping] = - dialect.documents().fragments().find(doc => fragment.encodes.metaURIs.exists(_.equals(doc.encoded().value()))) + private def documentForFragment(fragment: Fragment, documentDefinition: DocumentDefinition): Option[DocumentMapping] = + documentDefinition.documents().flatMap(_.fragments().find(doc => fragment.encodes.metaURIs.exists(_.equals(doc.encoded().value())))) def isValidationProfile: Boolean = bu match { diff --git a/als-common/shared/src/main/scala/org/mulesoft/amfintegration/DefinitionWithVendor.scala b/als-common/shared/src/main/scala/org/mulesoft/amfintegration/DefinitionWithVendor.scala new file mode 100644 index 0000000000..2e9a77a6a3 --- /dev/null +++ b/als-common/shared/src/main/scala/org/mulesoft/amfintegration/DefinitionWithVendor.scala @@ -0,0 +1,10 @@ +package org.mulesoft.amfintegration + +import amf.core.internal.remote.Spec +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition + +case class DefinitionWithVendor(documentDefinition: DocumentDefinition, spec: Spec, version: Option[String] = None) + +object DefinitionWithVendor { + def apply(documentDefinition: DocumentDefinition, spec: Spec, version: String) = new DefinitionWithVendor(documentDefinition, spec, Some(version)) +} diff --git a/als-common/shared/src/main/scala/org/mulesoft/amfintegration/DialectWithVendor.scala b/als-common/shared/src/main/scala/org/mulesoft/amfintegration/DialectWithVendor.scala deleted file mode 100644 index e401d7c89f..0000000000 --- a/als-common/shared/src/main/scala/org/mulesoft/amfintegration/DialectWithVendor.scala +++ /dev/null @@ -1,10 +0,0 @@ -package org.mulesoft.amfintegration - -import amf.aml.client.scala.model.document.Dialect -import amf.core.internal.remote.Spec - -case class DialectWithVendor(dialect: Dialect, spec: Spec, version: Option[String] = None) - -object DialectWithVendor { - def apply(dialect: Dialect, spec: Spec, version: String) = new DialectWithVendor(dialect, spec, Some(version)) -} diff --git a/als-common/shared/src/main/scala/org/mulesoft/amfintegration/amfconfiguration/ALSConfigurationState.scala b/als-common/shared/src/main/scala/org/mulesoft/amfintegration/amfconfiguration/ALSConfigurationState.scala index 7cb69eb1bf..aaf65a32fa 100644 --- a/als-common/shared/src/main/scala/org/mulesoft/amfintegration/amfconfiguration/ALSConfigurationState.scala +++ b/als-common/shared/src/main/scala/org/mulesoft/amfintegration/amfconfiguration/ALSConfigurationState.scala @@ -1,7 +1,7 @@ package org.mulesoft.amfintegration.amfconfiguration +import amf.aml.client.scala.{AMLConfiguration, AMLConfigurationState} import amf.aml.client.scala.model.document.{Dialect, DialectInstanceUnit, Vocabulary} import amf.aml.client.scala.model.domain.{AnnotationMapping, SemanticExtension} -import amf.aml.client.scala.{AMLConfiguration, AMLConfigurationState} import amf.apicontract.client.scala._ import amf.core.client.common.remote.Content import amf.core.client.scala.config.{RenderOptions, UnitCache} @@ -11,6 +11,7 @@ import amf.core.client.scala.{AMFParseResult => AMFParsingResult} import amf.core.internal.remote.Spec.{AMF, GRAPHQL} import amf.core.internal.remote.{AmlDialectSpec, Spec} import amf.graphql.client.scala.GraphQLConfiguration +import amf.shapes.client.scala.ShapesConfiguration import amf.shapes.client.scala.config.JsonSchemaConfiguration import amf.shapes.client.scala.model.document.JsonSchemaDocument import amf.shapes.client.scala.model.domain.AnyShape @@ -20,9 +21,11 @@ import org.mulesoft.amfintegration.AmfImplicits._ import org.mulesoft.amfintegration.ValidationProfile import org.mulesoft.amfintegration.dialect.dialects.ExternalFragmentDialect import org.mulesoft.amfintegration.dialect.dialects.metadialect.{MetaDialect, VocabularyDialect} -import org.mulesoft.amfintegration.dialect.integration.BaseAlsDialectProvider +import org.mulesoft.amfintegration.dialect.integration.BaseAlsDefinitionsProvider +import org.mulesoft.amfintegration.dialect.jsonschemas.MCPJsonSchema import org.mulesoft.amfintegration.platform.AlsPlatformSecrets import org.yaml.builder.DocBuilder +import amf.mcp.internal.plugins.parse.schema.MCPSchemaLoader import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.Future @@ -42,12 +45,12 @@ case class ALSConfigurationState( def configForUnit(unit: BaseUnit): AMLSpecificConfiguration = configForSpec(unit.sourceSpec.getOrElse(Spec.AML)) - private def rootConfiguration(asMain: Boolean): AMFConfiguration = projectState.rootProjectConfiguration(asMain) + private def rootConfiguration(asMain: Boolean): ShapesConfiguration = projectState.rootProjectConfiguration(asMain) - def configForDialect(d: Dialect): AMLSpecificConfiguration = + def configForDefinition(d: DocumentDefinition): AMLSpecificConfiguration = ProfileMatcher.spec(d) match { case Some(Spec.AML) - if d + if d.baseUnit .location() .contains( "file://vocabularies/dialects/metadialect.yaml" @@ -64,7 +67,7 @@ case class ALSConfigurationState( ) ) - private def apiConfigurationForSpec(spec: Spec): Option[AMFConfiguration] = + private def apiConfigurationForSpec(spec: Spec): Option[ShapesConfiguration] = spec match { case Spec.RAML10 => Some(RAMLConfiguration.RAML10()) case Spec.RAML08 => Some(RAMLConfiguration.RAML08()) @@ -75,23 +78,26 @@ case class ALSConfigurationState( case Spec.GRAPHQL => Some(ConfigurationAdapter.adapt(GraphQLConfiguration.GraphQL())) case Spec.JSONSCHEMA => Some(ConfigurationAdapter.adapt(JsonSchemaConfiguration.JsonSchema())) case Spec.AVRO_SCHEMA => Some(AvroConfiguration.Avro()) + case Spec.MCP => Some(projectState.getMCPProjectConfig(true)) case _ if spec.isAsync => Some(AsyncAPIConfiguration.Async20()) case _ => None } - def getAmfConfig(url: String, asMain: Boolean): AMFConfiguration = { - val base = + def getAmfConfig(url: String, asMain: Boolean): ShapesConfiguration = { + val base: ShapesConfiguration = if (url.endsWith("graphql")) projectState.getGraphQLProjectConfig(asMain) else if (url.endsWith("avsc")) projectState.getAvroProjectConfig(asMain).withPlugins(editorState.alsParsingPlugins) + else if (MCPJsonSchema.isMcpFile(url)) + projectState.getMCPProjectConfig(asMain).withPlugins(editorState.alsParsingPlugins) else getAmfConfig(asMain).withPlugins(editorState.alsParsingPlugins) getAmfConfig(base, asMain) } - def getAmfConfig(asMain: Boolean): AMFConfiguration = getAmfConfig(rootConfiguration(asMain), asMain) + def getAmfConfig(asMain: Boolean): ShapesConfiguration = getAmfConfig(rootConfiguration(asMain), asMain) - def getAmfConfig(spec: Spec): AMFConfiguration = { + def getAmfConfig(spec: Spec): ShapesConfiguration = { val base = spec match { case GRAPHQL => GraphQLConfiguration.GraphQL() // case GRPC => @@ -101,7 +107,7 @@ case class ALSConfigurationState( getAmfConfig(base, asMain = true) // todo: check if asMain = true has any inconvenience } - def allDialects: Seq[Dialect] = dialects ++ BaseAlsDialectProvider.allBaseDialects + def allDefinitions: Seq[DocumentDefinition] = dialects.map(DocumentDefinition(_)) ++ BaseAlsDefinitionsProvider.allBaseDefinitions def dialects: Seq[Dialect] = projectState.extensions ++ editorState.dialects def profiles: Seq[ValidationProfile] = projectState.profiles ++ editorState.profiles @@ -123,8 +129,9 @@ case class ALSConfigurationState( dialects.foldLeft(configuration)((c, dialect) => c.withDialect(dialect)) } - def getAmfConfig(base: AMFConfiguration, asMain: Boolean): AMFConfiguration = - projectState.customSetUp(getAmlConfig(base).asInstanceOf[AMFConfiguration], asMain) + + def getAmfConfig(base: ShapesConfiguration, asMain: Boolean): ShapesConfiguration = + projectState.customSetUp(getAmlConfig(base).asInstanceOf[ShapesConfiguration], asMain) // todo: this .asInstanceOf[ShapesConfiguration] is horrible, look for a better way def findSemanticByName(name: String): Option[(SemanticExtension, Dialect)] = configForSpec(Spec.AML).config.configurationState().findSemanticByName(name) @@ -132,7 +139,7 @@ case class ALSConfigurationState( def parse(url: String, asMain: Boolean = false, maxFileSize: Option[Int] = None): Future[AmfParseResult] = parse(getAmfConfig(url, asMain), url, maxFileSize) - private def parse(amfConfiguration: AMFConfiguration, uri: String, maxFileSize: Option[Int]): Future[AmfParseResult] = + private def parse(amfConfiguration: ShapesConfiguration, uri: String, maxFileSize: Option[Int]): Future[AmfParseResult] = wrapLoadersIfNeeded(amfConfiguration, maxFileSize) .baseUnitClient() .parse(uri) @@ -140,7 +147,7 @@ case class ALSConfigurationState( toResult(uri, r) } - private def wrapLoadersIfNeeded(amfConfiguration: AMFConfiguration, maxFileSize: Option[Int]) = + private def wrapLoadersIfNeeded(amfConfiguration: ShapesConfiguration, maxFileSize: Option[Int]) = maxFileSize match { case Some(maxSize) if maxSize > 0 => val counter = new MaxSizeCounter(maxSize) @@ -213,44 +220,46 @@ case class ALSConfigurationState( .baseUnitClient() .renderGraphToBuilder(resolved.cloneUnit(), builder) - private def allDialects(configurationState: AMLConfigurationState) = - configurationState.getDialects().toSet ++ BaseAlsDialectProvider.allBaseDialects + private def allDialects(configurationState: AMLConfigurationState): Set[DocumentDefinition] = + (configurationState.getDialects().map(DocumentDefinition(_)).toSet ++ BaseAlsDefinitionsProvider.allBaseDefinitions) - def definitionFor(bu: BaseUnit): Option[Dialect] = { + def definitionFor(bu: BaseUnit): Option[DocumentDefinition] = { val configurationState = predefinedWithDialects.configurationState() def defaultDefinitionSearch = allDialects(configurationState).find(d => ProfileMatcher.spec(d).contains(bu.sourceSpec.getOrElse(Spec.AMF))) - def overwrittenSpecs: Option[Dialect] = + def overwrittenSpecs: Option[DocumentDefinition] = if (bu.sourceSpec.exists(_.isAsync)) allDialects(configurationState).find(d => ProfileMatcher.spec(d).contains(Spec.ASYNC20)) + else if (bu.sourceSpec.exists(_.toString == "Mcp")) // ask for AMF to expose a way to identify this better, or wrap `editorState.schemas` so it has a (spec -> DD) + Some(DocumentDefinition(MCPSchemaLoader.doc))// editorState.schemas.headOption.map(DocumentDefinition(_)) // todo: implement a search mechanism to support more than one def else None bu match { case di: DialectInstanceUnit => - allDialects(configurationState).find(d => di.definedBy().option().contains(d.id)) + allDialects(configurationState).find(d => di.definedBy().option().contains(d.baseUnit.id)) case _: Dialect => - Some(MetaDialect.dialect) + Some(DocumentDefinition(MetaDialect.dialect)) case _: Vocabulary => - Some(VocabularyDialect.dialect) + Some(DocumentDefinition(VocabularyDialect.dialect)) case _: ExternalFragment => - Some(ExternalFragmentDialect.dialect) + Some(DocumentDefinition(ExternalFragmentDialect.dialect)) case jsonSchema: JsonSchemaDocument if jsonSchema.schemaVersion.nonEmpty => // all drafts use same Spec, so we must differentiate with version allDialects(configurationState) - .find(d => d.version().option().contains(jsonSchema.schemaVersion.value())) + .find(d => d.version().contains(jsonSchema.schemaVersion.value())) .orElse(defaultDefinitionSearch) case _ => defaultDefinitionSearch.orElse(overwrittenSpecs) } } - def definitionFor(spec: Spec): Option[Dialect] = { + def definitionFor(spec: Spec): Option[DocumentDefinition] = { val configurationState = predefinedWithDialects.configurationState() spec match { case AmlDialectSpec(id) => - allDialects(configurationState).find(_.id == id) + allDialects(configurationState).find(_.baseUnit.id == id) case _ => allDialects(configurationState).find(d => ProfileMatcher.spec(d).contains(spec)) } } diff --git a/als-common/shared/src/main/scala/org/mulesoft/amfintegration/amfconfiguration/AmfParseResult.scala b/als-common/shared/src/main/scala/org/mulesoft/amfintegration/amfconfiguration/AmfParseResult.scala index f48c8f2a13..d698ec9d77 100644 --- a/als-common/shared/src/main/scala/org/mulesoft/amfintegration/amfconfiguration/AmfParseResult.scala +++ b/als-common/shared/src/main/scala/org/mulesoft/amfintegration/amfconfiguration/AmfParseResult.scala @@ -1,13 +1,12 @@ package org.mulesoft.amfintegration.amfconfiguration -import amf.aml.client.scala.model.document.Dialect -import amf.apicontract.client.scala.AMFConfiguration import amf.core.client.scala.AMFResult import amf.core.client.scala.validation.AMFValidationResult +import amf.shapes.client.scala.ShapesConfiguration import org.mulesoft.amfintegration.AmfImplicits.BaseUnitImp import org.mulesoft.common.collections._ -case class AmfParseContext(amfConfiguration: AMFConfiguration, state: ALSConfigurationState) +case class AmfParseContext(amfConfiguration: ShapesConfiguration, state: ALSConfigurationState) class AmfResult(val result: AMFResult) { val location: String = result.baseUnit.location().getOrElse(result.baseUnit.id) @@ -21,8 +20,8 @@ class AmfResult(val result: AMFResult) { } class AmfParseResult( - override val result: AMFResult, - val definedBy: Dialect, - val context: AmfParseContext, - val uri: String + override val result: AMFResult, + val documentDefinition: DocumentDefinition, + val context: AmfParseContext, + val uri: String ) extends AmfResult(result) diff --git a/als-common/shared/src/main/scala/org/mulesoft/amfintegration/amfconfiguration/DocumentDefinition.scala b/als-common/shared/src/main/scala/org/mulesoft/amfintegration/amfconfiguration/DocumentDefinition.scala new file mode 100644 index 0000000000..a9e5ac485e --- /dev/null +++ b/als-common/shared/src/main/scala/org/mulesoft/amfintegration/amfconfiguration/DocumentDefinition.scala @@ -0,0 +1,76 @@ +package org.mulesoft.amfintegration.amfconfiguration + +import amf.aml.client.scala.model.document.Dialect +import amf.aml.client.scala.model.domain.{DocumentsModel, NodeMapping} +import amf.aml.internal.metamodel.document.DialectModel.Documents +import amf.core.client.scala.model.document.BaseUnit +import amf.core.client.scala.model.domain.DomainElement +import amf.core.internal.metamodel.document.BaseUnitModel +import amf.core.internal.parser.domain.{Annotations, Fields} +import amf.shapes.client.scala.model.document.JsonSchemaDocument +import amf.shapes.internal.document.metamodel.JsonSchemaDocumentModel +import org.mulesoft.amfintegration.AmfImplicits.DialectImplicits + +trait DocumentDefinition { + // todo: check if all this is needed, I think most don't apply for other than Dialects + def nameAndVersion(): String + def name(): Option[String] + def version(): Option[String] + def documents(): Option[DocumentsModel] + def declarationsMapTerms: Map[String, String] + def findNodeMappingByTerm(term: String): Option[NodeMapping] + def findNodeMapping(mappingId: String): Option[NodeMapping] + def declares: Seq[DomainElement] + def termsForId: Map[String, String] + def isJsonStyle: Boolean + val baseUnit: BaseUnit +} + +sealed case class DialectDocumentDefinition(override val baseUnit: Dialect) extends DocumentDefinition { + override def nameAndVersion(): String = baseUnit.nameAndVersion() + + override def name(): Option[String] = baseUnit.name().option() + + override def version(): Option[String] = baseUnit.version().option() + + override def documents(): Option[DocumentsModel] = Option(baseUnit.documents()) + + override def declarationsMapTerms: Map[String, String] = baseUnit.declarationsMapTerms + + override def findNodeMappingByTerm(term: String): Option[NodeMapping] = baseUnit.findNodeMappingByTerm(term) + + override def findNodeMapping(mappingId: String): Option[NodeMapping] = baseUnit.findNodeMapping(mappingId) + + override def declares: Seq[DomainElement] = baseUnit.declares + + override def termsForId: Map[String, String] = baseUnit.termsForId + + override def isJsonStyle: Boolean = baseUnit.isJsonStyle +} + +sealed case class JsonSchemaDocumentDefinition(override val baseUnit: JsonSchemaDocument) extends DocumentDefinition { + override def nameAndVersion(): String = baseUnit.schemaVersion.option().getOrElse(baseUnit.id) + + override def name(): Option[String] = None + + override def version(): Option[String] = baseUnit.schemaVersion.option() + + override def documents(): Option[DocumentsModel] = None + + override def declarationsMapTerms: Map[String, String] = Map.empty + + override def findNodeMappingByTerm(term: String): Option[NodeMapping] = None + + override def findNodeMapping(mappingId: String): Option[NodeMapping] = None + + override def declares: Seq[DomainElement] = baseUnit.declares + + override def termsForId: Map[String, String] = Map.empty + + override def isJsonStyle: Boolean = true +} + +object DocumentDefinition { + def apply(document: Dialect): DocumentDefinition = DialectDocumentDefinition(document) + def apply(document: JsonSchemaDocument): DocumentDefinition = JsonSchemaDocumentDefinition(document) +} \ No newline at end of file diff --git a/als-common/shared/src/main/scala/org/mulesoft/amfintegration/amfconfiguration/EditorConfiguration.scala b/als-common/shared/src/main/scala/org/mulesoft/amfintegration/amfconfiguration/EditorConfiguration.scala index f8f52e09de..071f8e8a45 100644 --- a/als-common/shared/src/main/scala/org/mulesoft/amfintegration/amfconfiguration/EditorConfiguration.scala +++ b/als-common/shared/src/main/scala/org/mulesoft/amfintegration/amfconfiguration/EditorConfiguration.scala @@ -10,15 +10,12 @@ import amf.core.client.scala.validation.payload.AMFShapePayloadValidationPlugin import amf.core.internal.remote.Spec import amf.graphql.client.scala.GraphQLConfiguration import amf.shapes.client.scala.config.JsonSchemaConfiguration +import amf.shapes.client.scala.model.document.JsonSchemaDocument import org.mulesoft.als.logger.Logger import org.mulesoft.amfintegration.AmfImplicits.DialectInstanceImp -import org.mulesoft.amfintegration.dialect.integration.BaseAlsDialectProvider +import org.mulesoft.amfintegration.dialect.integration.BaseAlsDefinitionsProvider import org.mulesoft.amfintegration.platform.AlsPlatformSecrets -import org.mulesoft.amfintegration.vocabularies.integration.{ - AlsVocabularyParsingPlugin, - AlsVocabularyRegistry, - DefaultVocabularies -} +import org.mulesoft.amfintegration.vocabularies.integration.{AlsVocabularyParsingPlugin, AlsVocabularyRegistry, DefaultVocabularies} import org.mulesoft.amfintegration.{AlsSyamlSyntaxPluginHacked, ValidationProfile} import scala.concurrent.ExecutionContext.Implicits.global @@ -34,45 +31,58 @@ case class EditorConfiguration( validationPlugin: Seq[AMFShapePayloadValidationPlugin] ) extends EditorConfigurationProvider { // todo: add hot reload - val baseConfiguration: AMLConfiguration = AMLConfiguration + val baseDialectConfiguration: AMLConfiguration = AMLConfiguration .predefined() .withResourceLoaders(resourceLoaders.toList) .withPlugins(validationPlugin.toList) // laziness is necessary when communicating through socket as the initialization must be done for that. - private lazy val inMemoryDialects: Future[Seq[Dialect]] = - Future.sequence(BaseAlsDialectProvider.rawDialects) + private lazy val inMemoryDefinitions: Future[Seq[DocumentDefinition]] = + Future.sequence(BaseAlsDefinitionsProvider.rawDefinitions) private var dialects: Seq[String] = Seq.empty - private var parsedDialects: Future[Seq[Dialect]] = parseDialects + private var parsedDialects: Future[Seq[DocumentDefinition]] = parseDialects private var profiles: Seq[String] = Seq.empty private var parsedProfiles: Future[Seq[ValidationProfile]] = parseProfiles private val vocabularyRegistry: AlsVocabularyRegistry = AlsVocabularyRegistry(DefaultVocabularies.all) - private def getDialects: Future[Seq[Dialect]] = parsedDialects + private def getDefinitions: Future[Seq[DocumentDefinition]] = parsedDialects - private def getRawAndLocalDialects: Future[Seq[Dialect]] = + private def getRawAndLocalDefinitions: Future[Seq[DocumentDefinition]] = for { - local <- getDialects - raw <- inMemoryDialects + local <- getDefinitions + raw <- inMemoryDefinitions } yield local ++ raw - private def parseDialects: Future[Seq[Dialect]] = + private def getRawAndLocalDialects: Future[Seq[Dialect]] = + getRawAndLocalDefinitions + .map(_.collect{ + case DialectDocumentDefinition(definition) => definition + }) + + private def getRawAndLocalSchemas: Future[Seq[JsonSchemaDocument]] = + getRawAndLocalDefinitions + .map(_.collect{ + case JsonSchemaDocumentDefinition(definition) => definition + }) + + private def parseDialects: Future[Seq[DocumentDefinition]] = Future.sequence( dialects.map( - baseConfiguration - .withResourceLoader(BaseAlsDialectProvider.globalDialectResourceLoader) + baseDialectConfiguration + .withResourceLoader(BaseAlsDefinitionsProvider.globalDefinitionsResourceLoader) .baseUnitClient() .parseDialect(_) .map(_.dialect) + .map(DocumentDefinition(_)) ) ) private def parseProfiles: Future[Seq[ValidationProfile]] = getRawAndLocalDialects - .map(seq => seq.foldLeft(baseConfiguration)((c, dialect) => c.withDialect(dialect))) + .map(seq => seq.foldLeft(baseDialectConfiguration)((c, dialect) => c.withDialect(dialect))) .flatMap { config => Future.sequence( profiles.map(uri => @@ -95,10 +105,12 @@ case class EditorConfiguration( override def getState: Future[EditorConfigurationState] = for { dialects <- getRawAndLocalDialects + schemas <- getRawAndLocalSchemas profiles <- parsedProfiles } yield EditorConfigurationState( resourceLoaders, dialects, + schemas, profiles, vocabularyRegistry, syntaxPlugins, @@ -123,12 +135,12 @@ case class EditorConfiguration( case class EditorConfigurationState( resourceLoader: Seq[ResourceLoader], dialects: Seq[Dialect], + schemas: Seq[JsonSchemaDocument], profiles: Seq[ValidationProfile], vocabularyRegistry: AlsVocabularyRegistry = AlsVocabularyRegistry(DefaultVocabularies.all), syntaxPlugin: Seq[AMFSyntaxParsePlugin], validationPlugin: Seq[AMFShapePayloadValidationPlugin] ) { - def getAmlConfig: AMLConfiguration = { dialects .foldLeft(AMLConfiguration.predefined())((c, d) => c.withDialect(d)) @@ -141,7 +153,7 @@ case class EditorConfigurationState( object EditorConfigurationState { def empty: EditorConfigurationState = - EditorConfigurationState(Nil, Nil, Nil, syntaxPlugin = Nil, validationPlugin = Nil) + EditorConfigurationState(Nil, Nil, Nil, Nil, syntaxPlugin = Nil, validationPlugin = Nil) } object EditorConfiguration extends AlsPlatformSecrets { diff --git a/als-common/shared/src/main/scala/org/mulesoft/amfintegration/amfconfiguration/ProfileMatcher.scala b/als-common/shared/src/main/scala/org/mulesoft/amfintegration/amfconfiguration/ProfileMatcher.scala index 710682f8cd..eb63c85819 100644 --- a/als-common/shared/src/main/scala/org/mulesoft/amfintegration/amfconfiguration/ProfileMatcher.scala +++ b/als-common/shared/src/main/scala/org/mulesoft/amfintegration/amfconfiguration/ProfileMatcher.scala @@ -1,6 +1,5 @@ package org.mulesoft.amfintegration.amfconfiguration -import amf.aml.client.scala.model.document.Dialect import amf.core.client.common.validation.{ProfileName, ProfileNames} import amf.core.client.scala.model.document.BaseUnit import amf.core.internal.remote.Spec @@ -9,7 +8,7 @@ import amf.shapes.internal.spec.common.{ JSONSchemaDraft4SchemaVersion, JSONSchemaDraft7SchemaVersion } -import org.mulesoft.amfintegration.DialectWithVendor +import org.mulesoft.amfintegration.DefinitionWithVendor import org.mulesoft.amfintegration.dialect.dialects.asyncapi20.AsyncApi20Dialect import org.mulesoft.amfintegration.dialect.dialects.asyncapi26.AsyncApi26Dialect import org.mulesoft.amfintegration.dialect.dialects.avro.AvroDialect @@ -41,30 +40,31 @@ object ProfileMatcher { case Spec.ASYNC25 => ProfileNames.ASYNC20 case Spec.ASYNC26 => ProfileNames.ASYNC26 case Spec.AML => ProfileNames.AML - case Spec.GRAPHQL => ProfileNames.GRPC + case Spec.GRAPHQL => ProfileNames.GRAPHQL + case Spec.GRPC => ProfileNames.GRPC case Spec.JSONSCHEMA => ProfileNames.JSONSCHEMA case Spec.AVRO_SCHEMA => ProfileNames.AVROSCHEMA case _ => ProfileNames.AMF } - private lazy val webApiDialects: Set[DialectWithVendor] = Set( - DialectWithVendor(Raml08TypesDialect(), Spec.RAML08), - DialectWithVendor(Raml10TypesDialect(), Spec.RAML10), - DialectWithVendor(OAS20Dialect(), Spec.OAS20), - DialectWithVendor(OAS30Dialect(), Spec.OAS30), - DialectWithVendor(AsyncApi20Dialect(), Spec.ASYNC20), - DialectWithVendor(AsyncApi26Dialect(), Spec.ASYNC26), - DialectWithVendor(GraphQLDialect(), Spec.GRAPHQL), - DialectWithVendor(JsonSchemaDraft4Dialect(), Spec.JSONSCHEMA, JSONSchemaDraft4SchemaVersion.name), - DialectWithVendor(JsonSchemaDraft7Dialect(), Spec.JSONSCHEMA, JSONSchemaDraft7SchemaVersion.name), - DialectWithVendor(JsonSchemaDraft2019Dialect(), Spec.JSONSCHEMA, JSONSchemaDraft201909SchemaVersion.name), - DialectWithVendor(AvroDialect(), Spec.AVRO_SCHEMA), - DialectWithVendor(MetaDialect(), Spec.AML) + private lazy val webApiDefinitions: Set[DefinitionWithVendor] = Set( + DefinitionWithVendor(DocumentDefinition(Raml08TypesDialect()), Spec.RAML08), + DefinitionWithVendor(DocumentDefinition(Raml10TypesDialect()), Spec.RAML10), + DefinitionWithVendor(DocumentDefinition(OAS20Dialect()), Spec.OAS20), + DefinitionWithVendor(DocumentDefinition(OAS30Dialect()), Spec.OAS30), + DefinitionWithVendor(DocumentDefinition(AsyncApi20Dialect()), Spec.ASYNC20), + DefinitionWithVendor(DocumentDefinition(AsyncApi26Dialect()), Spec.ASYNC26), + DefinitionWithVendor(DocumentDefinition(GraphQLDialect()), Spec.GRAPHQL), + DefinitionWithVendor(DocumentDefinition(JsonSchemaDraft4Dialect()), Spec.JSONSCHEMA, JSONSchemaDraft4SchemaVersion.name), + DefinitionWithVendor(DocumentDefinition(JsonSchemaDraft7Dialect()), Spec.JSONSCHEMA, JSONSchemaDraft7SchemaVersion.name), + DefinitionWithVendor(DocumentDefinition(JsonSchemaDraft2019Dialect()), Spec.JSONSCHEMA, JSONSchemaDraft201909SchemaVersion.name), + DefinitionWithVendor(DocumentDefinition(AvroDialect()), Spec.AVRO_SCHEMA), + DefinitionWithVendor(DocumentDefinition(MetaDialect()), Spec.AML) ) - def dialect(spec: Spec): Option[Dialect] = - webApiDialects.find(_.spec == spec).map(_.dialect) + def dialect(spec: Spec): Option[DocumentDefinition] = + webApiDefinitions.find(_.spec == spec).map(_.documentDefinition) - def spec(dialect: Dialect): Option[Spec] = - webApiDialects.find(_.dialect == dialect).map(_.spec) + def spec(documentDefinition: DocumentDefinition): Option[Spec] = + webApiDefinitions.find(_.documentDefinition == documentDefinition).map(_.spec) } diff --git a/als-common/shared/src/main/scala/org/mulesoft/amfintegration/amfconfiguration/ProjectConfigurationState.scala b/als-common/shared/src/main/scala/org/mulesoft/amfintegration/amfconfiguration/ProjectConfigurationState.scala index 938124605a..2141351f7b 100644 --- a/als-common/shared/src/main/scala/org/mulesoft/amfintegration/amfconfiguration/ProjectConfigurationState.scala +++ b/als-common/shared/src/main/scala/org/mulesoft/amfintegration/amfconfiguration/ProjectConfigurationState.scala @@ -1,22 +1,24 @@ package org.mulesoft.amfintegration.amfconfiguration import amf.aml.client.scala.model.document.Dialect -import amf.apicontract.client.scala.{AMFConfiguration, APIConfiguration, AvroConfiguration} -import amf.core.client.scala.{AMFGraphConfiguration, AMFParseResult} +import amf.apicontract.client.scala.{APIConfiguration, AvroConfiguration} +import amf.core.client.scala.AMFParseResult import amf.core.client.scala.config.{CachedReference, UnitCache} import amf.core.client.scala.model.document.Module import amf.core.client.scala.resource.ResourceLoader import amf.core.client.scala.validation.AMFValidationResult import amf.graphql.client.scala.GraphQLConfiguration +import amf.shapes.client.scala.ShapesConfiguration import org.mulesoft.als.configuration.ProjectConfiguration import org.mulesoft.amfintegration.ValidationProfile +import amf.mcp.client.scala.MCPConfiguration import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.Future trait ProjectConfigurationState { - def customSetUp(amfConfiguration: AMFConfiguration, asMain: Boolean): AMFConfiguration = amfConfiguration + def customSetUp(amfConfiguration: ShapesConfiguration, asMain: Boolean): ShapesConfiguration = amfConfiguration def cache: UnitCache def getCompanionForDialect(d: Dialect): Future[Option[Module]] = Future @@ -30,10 +32,12 @@ trait ProjectConfigurationState { ) .map(r => r.flatten.find(_._2).map(_._1)) - def getGraphQLProjectConfig(asMain: Boolean): AMFConfiguration = + def getGraphQLProjectConfig(asMain: Boolean): ShapesConfiguration = GraphQLConfiguration.GraphQL() - def getAvroProjectConfig(asMain: Boolean): AMFConfiguration = + def getAvroProjectConfig(asMain: Boolean): ShapesConfiguration = AvroConfiguration.Avro() + def getMCPProjectConfig(asMain: Boolean): ShapesConfiguration = + MCPConfiguration.MCP() val extensions: Seq[Dialect] val profiles: Seq[ValidationProfile] @@ -41,7 +45,7 @@ trait ProjectConfigurationState { val results: Seq[AMFParseResult] val resourceLoaders: Seq[ResourceLoader] val projectErrors: Seq[AMFValidationResult] - def rootProjectConfiguration(asMain: Boolean): AMFConfiguration = APIConfiguration.APIWithJsonSchema() + def rootProjectConfiguration(asMain: Boolean): ShapesConfiguration = APIConfiguration.APIWithJsonSchema() } case class EmptyProjectConfigurationState(folder: String) extends ProjectConfigurationState() { diff --git a/als-common/shared/src/main/scala/org/mulesoft/amfintegration/dialect/DialectKnowledge.scala b/als-common/shared/src/main/scala/org/mulesoft/amfintegration/dialect/DialectKnowledge.scala index d546049c8c..9c39a10d07 100644 --- a/als-common/shared/src/main/scala/org/mulesoft/amfintegration/dialect/DialectKnowledge.scala +++ b/als-common/shared/src/main/scala/org/mulesoft/amfintegration/dialect/DialectKnowledge.scala @@ -1,26 +1,26 @@ package org.mulesoft.amfintegration.dialect -import amf.aml.client.scala.model.document.Dialect import amf.plugins.document.vocabularies.plugin.ReferenceStyles import org.mulesoft.als.common.{ASTPartBranch, YPartBranch} +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition object DialectKnowledge { - def isStyleValue(style: String, dialect: Dialect): Boolean = - Option(dialect.documents()).forall(d => d.referenceStyle().is(style) || d.referenceStyle().isNullOrEmpty) + def isStyleValue(style: String, documentDefinition: DocumentDefinition): Boolean = + documentDefinition.documents().forall(d => d.referenceStyle().is(style) || d.referenceStyle().isNullOrEmpty) - def isRamlInclusion(yPartBranch: YPartBranch, dialect: Dialect): Boolean = - yPartBranch.hasIncludeTag && isStyleValue(ReferenceStyles.RAML, dialect) + def isRamlInclusion(yPartBranch: YPartBranch, documentDefinition: DocumentDefinition): Boolean = + yPartBranch.hasIncludeTag && isStyleValue(ReferenceStyles.RAML, documentDefinition) - def isJsonInclusion(yPartBranch: YPartBranch, dialect: Dialect): Boolean = - yPartBranch.isValue && isStyleValue(ReferenceStyles.JSONSCHEMA, dialect) && + def isJsonInclusion(yPartBranch: YPartBranch, documentDefinition: DocumentDefinition): Boolean = + yPartBranch.isValue && isStyleValue(ReferenceStyles.JSONSCHEMA, documentDefinition) && yPartBranch.parentEntry.exists(p => p.key.asScalar.exists(_.text == "$ref")) - def isInclusion(yPartBranch: YPartBranch, dialect: Dialect): Boolean = - isRamlInclusion(yPartBranch, dialect) || isJsonInclusion(yPartBranch, dialect) + def isInclusion(yPartBranch: YPartBranch, documentDefinition: DocumentDefinition): Boolean = + isRamlInclusion(yPartBranch, documentDefinition) || isJsonInclusion(yPartBranch, documentDefinition) - def isInclusion(astPartBranch: ASTPartBranch, dialect: Dialect): Boolean = astPartBranch match { - case yPart: YPartBranch => isInclusion(yPart, dialect) + def isInclusion(astPartBranch: ASTPartBranch, documentDefinition: DocumentDefinition): Boolean = astPartBranch match { + case yPart: YPartBranch => isInclusion(yPart, documentDefinition) case _ => false } diff --git a/als-common/shared/src/main/scala/org/mulesoft/amfintegration/dialect/InMemoryDocument.scala b/als-common/shared/src/main/scala/org/mulesoft/amfintegration/dialect/InMemoryDocument.scala new file mode 100644 index 0000000000..df7fc68137 --- /dev/null +++ b/als-common/shared/src/main/scala/org/mulesoft/amfintegration/dialect/InMemoryDocument.scala @@ -0,0 +1,12 @@ +package org.mulesoft.amfintegration.dialect + +import amf.core.client.common.remote.Content +import amf.core.client.scala.lexer.CharSequenceStream + +trait InMemoryDocument { + val name: String + val fileContent: String + val extension: String + def uri: String = s"file://als/dialects/memory/$name.$extension" + final lazy val content: Content = Content(new CharSequenceStream(fileContent), uri) +} diff --git a/als-common/shared/src/main/scala/org/mulesoft/amfintegration/dialect/dialects/CanonicalApiDialect.scala b/als-common/shared/src/main/scala/org/mulesoft/amfintegration/dialect/dialects/CanonicalApiDialect.scala index 3e472e8a2b..4f6607f81b 100644 --- a/als-common/shared/src/main/scala/org/mulesoft/amfintegration/dialect/dialects/CanonicalApiDialect.scala +++ b/als-common/shared/src/main/scala/org/mulesoft/amfintegration/dialect/dialects/CanonicalApiDialect.scala @@ -2,7 +2,7 @@ package org.mulesoft.amfintegration.dialect.dialects object CanonicalApiDialect extends InMemoryDialect { override val name: String = "webapi-spec" - override val yaml: String = CanonicalApiContent.part1 + CanonicalApiContent.part2 + override val fileContent: String = CanonicalApiContent.part1 + CanonicalApiContent.part2 } private object CanonicalApiContent { diff --git a/als-common/shared/src/main/scala/org/mulesoft/amfintegration/dialect/dialects/InMemoryDialect.scala b/als-common/shared/src/main/scala/org/mulesoft/amfintegration/dialect/dialects/InMemoryDialect.scala index c054516e3a..53573126ed 100644 --- a/als-common/shared/src/main/scala/org/mulesoft/amfintegration/dialect/dialects/InMemoryDialect.scala +++ b/als-common/shared/src/main/scala/org/mulesoft/amfintegration/dialect/dialects/InMemoryDialect.scala @@ -1,11 +1,7 @@ package org.mulesoft.amfintegration.dialect.dialects -import amf.core.client.common.remote.Content -import amf.core.client.scala.lexer.CharSequenceStream +import org.mulesoft.amfintegration.dialect.InMemoryDocument -trait InMemoryDialect { - val name: String - val yaml: String - def uri: String = s"file://als/dialects/memory/$name.yaml" - final lazy val content: Content = Content(new CharSequenceStream(yaml), uri) +trait InMemoryDialect extends InMemoryDocument { + override final val extension: String = "yaml" } diff --git a/als-common/shared/src/main/scala/org/mulesoft/amfintegration/dialect/dialects/validations/RawValidationProfileDialect.scala b/als-common/shared/src/main/scala/org/mulesoft/amfintegration/dialect/dialects/validations/RawValidationProfileDialect.scala index a1b98d8d57..6b8c8d6c00 100644 --- a/als-common/shared/src/main/scala/org/mulesoft/amfintegration/dialect/dialects/validations/RawValidationProfileDialect.scala +++ b/als-common/shared/src/main/scala/org/mulesoft/amfintegration/dialect/dialects/validations/RawValidationProfileDialect.scala @@ -4,7 +4,7 @@ import org.mulesoft.amfintegration.dialect.dialects.InMemoryDialect object RawValidationProfileDialect extends InMemoryDialect { val name: String = "validation-profile" - lazy val yaml: String = + lazy val fileContent: String = """#%Dialect 1.0 | |dialect: Validation Profile diff --git a/als-common/shared/src/main/scala/org/mulesoft/amfintegration/dialect/integration/BaseAlsDialectProvider.scala b/als-common/shared/src/main/scala/org/mulesoft/amfintegration/dialect/integration/BaseAlsDefinitionsProvider.scala similarity index 50% rename from als-common/shared/src/main/scala/org/mulesoft/amfintegration/dialect/integration/BaseAlsDialectProvider.scala rename to als-common/shared/src/main/scala/org/mulesoft/amfintegration/dialect/integration/BaseAlsDefinitionsProvider.scala index eebb55b0ee..194437b5ff 100644 --- a/als-common/shared/src/main/scala/org/mulesoft/amfintegration/dialect/integration/BaseAlsDialectProvider.scala +++ b/als-common/shared/src/main/scala/org/mulesoft/amfintegration/dialect/integration/BaseAlsDefinitionsProvider.scala @@ -1,10 +1,12 @@ package org.mulesoft.amfintegration.dialect.integration -import amf.aml.client.scala.model.document.Dialect import amf.core.client.common.remote.Content import amf.core.client.scala.lexer.CharSequenceStream import amf.core.client.scala.resource.ResourceLoader -import amf.custom.validation.internal.report.loaders.ProfileDialectLoader +import amf.custom.validation.internal.report.loaders.{InMemoryResourceLoader, ProfileDialectLoader} +import amf.shapes.client.scala.config.JsonLDSchemaConfiguration +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition +import org.mulesoft.amfintegration.dialect.InMemoryDocument import org.mulesoft.amfintegration.dialect.dialects.InMemoryDialect import org.mulesoft.amfintegration.dialect.dialects.asyncapi20.AsyncApi20Dialect import org.mulesoft.amfintegration.dialect.dialects.asyncapi26.AsyncApi26Dialect @@ -17,6 +19,7 @@ import org.mulesoft.amfintegration.dialect.dialects.metadialect.MetaDialect import org.mulesoft.amfintegration.dialect.dialects.oas.{OAS20Dialect, OAS30Dialect} import org.mulesoft.amfintegration.dialect.dialects.raml.raml08.Raml08TypesDialect import org.mulesoft.amfintegration.dialect.dialects.raml.raml10.Raml10TypesDialect +import org.mulesoft.amfintegration.dialect.jsonschemas.{InMemoryJsonSchema, MCPJsonSchema} import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.Future @@ -24,8 +27,8 @@ import scala.concurrent.Future /** @param dialects * initialized with the server on startup (for example Web API dialects) */ -object BaseAlsDialectProvider { - lazy val apiDialects: Set[Dialect] = Set( +object BaseAlsDefinitionsProvider { + lazy val apiDefinitions: Set[DocumentDefinition] = Set( Raml08TypesDialect(), Raml10TypesDialect(), OAS20Dialect(), @@ -37,32 +40,52 @@ object BaseAlsDialectProvider { JsonSchemaDraft7Dialect(), JsonSchemaDraft2019Dialect(), AvroDialect() - ) + ).map(DocumentDefinition(_)) - lazy val allBaseDialects: Set[Dialect] = apiDialects + MetaDialect() + lazy val allBaseDefinitions: Set[DocumentDefinition] = apiDefinitions + DocumentDefinition(MetaDialect()) - val rawDialects: Seq[Future[Dialect]] = Seq(ProfileDialectLoader.dialect) - - val globalDialectResourceLoader: ResourceLoader = new ResourceLoader { + val globalDefinitionsResourceLoader: ResourceLoader = new ResourceLoader { override def fetch(resource: String): Future[Content] = Future { - indexedDialects + indexedDefinitions .get(resource) .map(_.content) .getOrElse(Content(new CharSequenceStream(""), resource)) } override def accepts(resource: String): Boolean = - indexedDialects.contains(resource) + indexedDefinitions.contains(resource) + } + + lazy val rawDefinitions: Seq[Future[DocumentDefinition]] = { + val eventualMcpDefinition = JsonLDSchemaConfiguration.JsonLDSchema() + .withResourceLoader(InMemoryResourceLoader(MCPJsonSchema.uri, MCPJsonSchema.fileContent)) + .baseUnitClient() + .parseJsonLDSchema(MCPJsonSchema.uri) + .map(_.jsonDocument) + .map(DocumentDefinition(_)) + Seq( + ProfileDialectLoader.dialect.map(DocumentDefinition(_)), + eventualMcpDefinition + ) } - private var indexedDialects: Map[String, InMemoryDialect] = Map() + private var indexedDefinitions: Map[String, InMemoryDocument] = Map() /** Indexes a global dialect */ def indexDialect(uri: String, content: String): Unit = - indexedDialects = indexedDialects + (uri -> IndexedDialect(uri, content)) + indexedDefinitions = indexedDefinitions + (uri -> indexedInMemoryDocument(uri, content)) - sealed case class IndexedDialect(override val uri: String, yaml: String) extends InMemoryDialect { + private def indexedInMemoryDocument(uri: String, content: String): InMemoryDocument = { + // todo: this method to determine if the file is json is used everywhere, should be moved to a common place + if (uri.toLowerCase().endsWith(".json")) IndexedJsonSchema(uri, content) + else IndexedDialect(uri, content) + } + + private sealed case class IndexedDialect(override val uri: String, fileContent: String) extends InMemoryDialect { + override val name: String = uri + } + private sealed case class IndexedJsonSchema(override val uri: String, fileContent: String) extends InMemoryJsonSchema { override val name: String = uri } } diff --git a/als-common/shared/src/main/scala/org/mulesoft/amfintegration/dialect/jsonschemas/InMemoryJsonSchema.scala b/als-common/shared/src/main/scala/org/mulesoft/amfintegration/dialect/jsonschemas/InMemoryJsonSchema.scala new file mode 100644 index 0000000000..f2da7495e3 --- /dev/null +++ b/als-common/shared/src/main/scala/org/mulesoft/amfintegration/dialect/jsonschemas/InMemoryJsonSchema.scala @@ -0,0 +1,7 @@ +package org.mulesoft.amfintegration.dialect.jsonschemas + +import org.mulesoft.amfintegration.dialect.InMemoryDocument + +trait InMemoryJsonSchema extends InMemoryDocument { + override final val extension: String = "json" +} \ No newline at end of file diff --git a/als-common/shared/src/main/scala/org/mulesoft/amfintegration/dialect/jsonschemas/MCPJsonSchema.scala b/als-common/shared/src/main/scala/org/mulesoft/amfintegration/dialect/jsonschemas/MCPJsonSchema.scala new file mode 100644 index 0000000000..5d9409483a --- /dev/null +++ b/als-common/shared/src/main/scala/org/mulesoft/amfintegration/dialect/jsonschemas/MCPJsonSchema.scala @@ -0,0 +1,12 @@ +package org.mulesoft.amfintegration.dialect.jsonschemas + +import amf.mcp.internal.plugins.parse.schema.MCPSchema + +object MCPJsonSchema extends InMemoryJsonSchema { + override val name: String = "mcp-schema" + + override val fileContent: String = MCPSchema.schema + + def isMcpFile(url: String) = + url.endsWith(".mcp.json") || url.endsWith(".mcp.yaml") +} \ No newline at end of file diff --git a/als-common/shared/src/main/scala/org/mulesoft/amfintegration/override/OverrideProfileNames.scala b/als-common/shared/src/main/scala/org/mulesoft/amfintegration/override/OverrideProfileNames.scala index af979505f0..fee4211d29 100644 --- a/als-common/shared/src/main/scala/org/mulesoft/amfintegration/override/OverrideProfileNames.scala +++ b/als-common/shared/src/main/scala/org/mulesoft/amfintegration/override/OverrideProfileNames.scala @@ -1,6 +1,6 @@ package amf.core.client.common.validation -import amf.core.internal.remote._ +import amf.core.internal.remote.{Mcp, _} import scala.scalajs.js.annotation.{JSExportAll, JSExportTopLevel} @@ -24,6 +24,7 @@ object ProfileNames { val GRAPHQL_FEDERATION: ProfileName = GraphQLFederationProfile val JSONSCHEMA: ProfileName = JsonSchemaProfile val AVROSCHEMA: ProfileName = AvroSchemaProfile + val MCP: ProfileName = MCPSchemaProfile lazy val specProfiles: Seq[ProfileName] = Seq( @@ -108,6 +109,11 @@ object AvroSchemaProfile extends ProfileName(AvroSchema.id, AMFStyle) { override def isRaml(): Boolean = false } +object MCPSchemaProfile extends ProfileName(Mcp.id, AMFStyle) { + override def isOas(): Boolean = false + override def isRaml(): Boolean = false +} + object ProfileName { def unapply(name: String): Option[ProfileName] = name match { @@ -123,6 +129,7 @@ object ProfileName { case GraphQLFederationProfile.p => Some(GraphQLFederationProfile) case JsonSchemaProfile.p => Some(JsonSchemaProfile) case AvroSchemaProfile.p => Some(AvroSchemaProfile) + case MCPSchemaProfile.p => Some(MCPSchemaProfile) case _ => None } @@ -146,6 +153,7 @@ object ProfileName { case GraphQLFederation.id => GraphQLFederationProfile case JsonSchema.id => JsonSchemaProfile case AvroSchema.id => AvroSchemaProfile + case Mcp.id => MCPSchemaProfile case custom => new ProfileName(custom) } } diff --git a/als-common/shared/src/test/scala/org/mulesoft/als/common/objectintree/ObjectInTreeBaseTest.scala b/als-common/shared/src/test/scala/org/mulesoft/als/common/objectintree/ObjectInTreeBaseTest.scala index 6e224f56c1..3bfd1ee569 100644 --- a/als-common/shared/src/test/scala/org/mulesoft/als/common/objectintree/ObjectInTreeBaseTest.scala +++ b/als-common/shared/src/test/scala/org/mulesoft/als/common/objectintree/ObjectInTreeBaseTest.scala @@ -5,12 +5,7 @@ import amf.aml.internal.metamodel.domain.DialectDomainElementModel import org.mulesoft.als.common.dtoTypes.Position import org.mulesoft.als.common.{NodeBranchBuilder, ObjectInTree, ObjectInTreeBuilder} import org.mulesoft.amfintegration.AmfImplicits.BaseUnitImp -import org.mulesoft.amfintegration.amfconfiguration.{ - ALSConfigurationState, - AmfParseResult, - EditorConfiguration, - EmptyProjectConfigurationState -} +import org.mulesoft.amfintegration.amfconfiguration.{ALSConfigurationState, AmfParseResult, DocumentDefinition, EditorConfiguration, EmptyProjectConfigurationState} import org.mulesoft.amfintegration.platform.AlsPlatformSecrets import org.mulesoft.common.client.lexical.{Position => AmfPosition} import org.scalatest.compatible.Assertion @@ -34,11 +29,11 @@ case class ObjectInTreeBaseTest(instanceFile: String, dialectFile: String) exten ) } yield result } - private def fn(pos: AmfPosition, result: AmfParseResult, dialect: Dialect): ObjectInTree = + private def fn(pos: AmfPosition, result: AmfParseResult, documentDefinition: DocumentDefinition): ObjectInTree = ObjectInTreeBuilder.fromUnit( result.result.baseUnit, result.result.baseUnit.identifier, - dialect, + documentDefinition, NodeBranchBuilder.build(result.result.baseUnit, pos, strict = false) ) @@ -46,7 +41,7 @@ case class ObjectInTreeBaseTest(instanceFile: String, dialectFile: String) exten for { dialect <- global.getState.map(_.dialects.find(_.location().exists(_.contains(dialectFile)))) result <- eventualResult - } yield fn(_, result, dialect.get) + } yield fn(_, result, DocumentDefinition(dialect.get)) private def assertTypeIri(expectedTypeIri: String, tree: ObjectInTree) = tree.obj.meta match { diff --git a/als-server/shared/src/main/scala/org/mulesoft/als/server/modules/actions/CodeActionManager.scala b/als-server/shared/src/main/scala/org/mulesoft/als/server/modules/actions/CodeActionManager.scala index b91a52bc90..931b52f9bb 100644 --- a/als-server/shared/src/main/scala/org/mulesoft/als/server/modules/actions/CodeActionManager.scala +++ b/als-server/shared/src/main/scala/org/mulesoft/als/server/modules/actions/CodeActionManager.scala @@ -53,7 +53,7 @@ class CodeActionManager( bu.unit, bu.tree, bu.astPartBranch, - bu.definedBy, + bu.documentDefinition, configuration, allr, configurationBuilder, diff --git a/als-server/shared/src/main/scala/org/mulesoft/als/server/modules/actions/HoverManager.scala b/als-server/shared/src/main/scala/org/mulesoft/als/server/modules/actions/HoverManager.scala index 8919373a41..5b14b06ae8 100644 --- a/als-server/shared/src/main/scala/org/mulesoft/als/server/modules/actions/HoverManager.scala +++ b/als-server/shared/src/main/scala/org/mulesoft/als/server/modules/actions/HoverManager.scala @@ -58,7 +58,7 @@ class HoverManager(wm: WorkspaceManager) extends RequestModule[HoverClientCapabi dtoPosition, params.textDocument.uri, cu.context.state.editorState.vocabularyRegistry, - cu.definedBy + cu.documentDefinition ).getHover // if sequence, we could show all the semantic hierarchy? } diff --git a/als-server/shared/src/main/scala/org/mulesoft/als/server/modules/actions/rename/RenameTools.scala b/als-server/shared/src/main/scala/org/mulesoft/als/server/modules/actions/rename/RenameTools.scala index ca27b3cd62..5625102847 100644 --- a/als-server/shared/src/main/scala/org/mulesoft/als/server/modules/actions/rename/RenameTools.scala +++ b/als-server/shared/src/main/scala/org/mulesoft/als/server/modules/actions/rename/RenameTools.scala @@ -22,10 +22,10 @@ trait RenameTools { protected def isDeclarable(cu: CompilableUnit, tree: ObjectInTree): Boolean = (!tree.obj.isAbstract && !tree.obj.isInstanceOf[Document] && - tree.obj.declarableKey(cu.definedBy).isDefined) + tree.obj.declarableKey(cu.documentDefinition).isDefined) protected def isDeclarableKey(cu: CompilableUnit, position: Position, uri: String): Boolean = - (isDeclarable(cu, tree(cu, position, uri)) || cu.definedBy == MetaDialect.dialect) && + (isDeclarable(cu, tree(cu, position, uri)) || cu.documentDefinition.baseUnit == MetaDialect.dialect) && branch(cu, position, uri).isKey protected def keyCleanRange(uri: String, position: Position, bu: CompilableUnit): PositionRange = diff --git a/als-server/shared/src/main/scala/org/mulesoft/als/server/modules/completion/SuggestionsManager.scala b/als-server/shared/src/main/scala/org/mulesoft/als/server/modules/completion/SuggestionsManager.scala index 5a094b25eb..07e0aa1230 100644 --- a/als-server/shared/src/main/scala/org/mulesoft/als/server/modules/completion/SuggestionsManager.scala +++ b/als-server/shared/src/main/scala/org/mulesoft/als/server/modules/completion/SuggestionsManager.scala @@ -35,7 +35,7 @@ class SuggestionsManager( new Suggestions(configurationProvider.getConfiguration, directoryResolver, accessBundle) private def accessBundle: String => Future[UnitBundle] = - workspace.getLastUnit(_, UUID.randomUUID().toString).map(r => UnitBundle(r.unit, r.definedBy, r.context)) + workspace.getLastUnit(_, UUID.randomUUID().toString).map(r => UnitBundle(r.unit, r.documentDefinition, r.context)) private def snippetSupport: Boolean = conf diff --git a/als-server/shared/src/main/scala/org/mulesoft/als/server/modules/structure/StructureManager.scala b/als-server/shared/src/main/scala/org/mulesoft/als/server/modules/structure/StructureManager.scala index d0bd45e6ed..830c3bf920 100644 --- a/als-server/shared/src/main/scala/org/mulesoft/als/server/modules/structure/StructureManager.scala +++ b/als-server/shared/src/main/scala/org/mulesoft/als/server/modules/structure/StructureManager.scala @@ -80,6 +80,6 @@ class StructureManager( } def getStructureFromAST(cu: CompilableUnit, uuid: String): List[DocumentSymbol] = - StructureBuilder.listSymbols(cu.unit, cu.definedBy) + StructureBuilder.listSymbols(cu.unit, cu.documentDefinition) } diff --git a/als-server/shared/src/main/scala/org/mulesoft/als/server/modules/workspace/CompilableUnit.scala b/als-server/shared/src/main/scala/org/mulesoft/als/server/modules/workspace/CompilableUnit.scala index 9c93721534..73f2c801ce 100644 --- a/als-server/shared/src/main/scala/org/mulesoft/als/server/modules/workspace/CompilableUnit.scala +++ b/als-server/shared/src/main/scala/org/mulesoft/als/server/modules/workspace/CompilableUnit.scala @@ -3,20 +3,20 @@ package org.mulesoft.als.server.modules.workspace import amf.aml.client.scala.model.document.Dialect import amf.core.client.scala.model.document.BaseUnit import org.mulesoft.als.common.cache.UnitWithCaches -import org.mulesoft.amfintegration.amfconfiguration.AmfParseContext +import org.mulesoft.amfintegration.amfconfiguration.{AmfParseContext, DocumentDefinition} import org.mulesoft.amfintegration.{ErrorsCollected, UnitWithNextReference} import scala.concurrent.Future case class CompilableUnit( - uri: String, - unit: BaseUnit, - mainFile: Option[String], - isDirty: Boolean = false, - private val n: Option[Future[CompilableUnit]], - override val definedBy: Dialect, - errorsCollected: ErrorsCollected, - context: AmfParseContext + uri: String, + unit: BaseUnit, + mainFile: Option[String], + isDirty: Boolean = false, + private val n: Option[Future[CompilableUnit]], + override val documentDefinition: DocumentDefinition, + errorsCollected: ErrorsCollected, + context: AmfParseContext ) extends UnitWithNextReference with UnitWithCaches { override protected type T = CompilableUnit diff --git a/als-server/shared/src/main/scala/org/mulesoft/als/server/modules/workspace/DefaultProjectConfigurationProvider.scala b/als-server/shared/src/main/scala/org/mulesoft/als/server/modules/workspace/DefaultProjectConfigurationProvider.scala index d9d06a7d0b..4c5b97d1d7 100644 --- a/als-server/shared/src/main/scala/org/mulesoft/als/server/modules/workspace/DefaultProjectConfigurationProvider.scala +++ b/als-server/shared/src/main/scala/org/mulesoft/als/server/modules/workspace/DefaultProjectConfigurationProvider.scala @@ -22,14 +22,12 @@ import scala.collection.mutable import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.Future -class ProjectConfigurationNotFound(folder: String) extends Exception(s"Couldn't find configuration for folder: $folder") - sealed class ConfigurationMap { case class ConfigurationContainer( configuration: Future[DefaultProjectConfiguration], projectConfig: ProjectConfiguration ) - var configurations: Map[String, ConfigurationContainer] = Map() + private var configurations: Map[String, ConfigurationContainer] = Map() def get(folder: String): Option[ConfigurationContainer] = synchronized { configurations.get(folder) @@ -152,7 +150,6 @@ class DefaultProjectConfigurationProvider( ) .map(_.flatMap(r => { if (r._1.baseUnit.isValidationProfile && r._1.conforms) { -// updateUnit(uuid, r, isDependency = true) //todo: cache r._1.dialectInstance match { case instance: DialectInstance => Logger.debug( @@ -218,7 +215,6 @@ class CacheBuilder( case Some(bu) => Future.successful(CachedReference(url, bu)) case _ => Future.failed(new Exception("Unit not found")) } - def cachedUnits: Seq[BaseUnit] = cache.values.toSeq def updateCache(main: AMFResult, units: Map[String, ParsedUnit]): Future[Unit] = { Future diff --git a/als-server/shared/src/main/scala/org/mulesoft/als/server/modules/workspace/MainFileTreeBuilder.scala b/als-server/shared/src/main/scala/org/mulesoft/als/server/modules/workspace/MainFileTreeBuilder.scala index ae17c33512..9807898453 100644 --- a/als-server/shared/src/main/scala/org/mulesoft/als/server/modules/workspace/MainFileTreeBuilder.scala +++ b/als-server/shared/src/main/scala/org/mulesoft/als/server/modules/workspace/MainFileTreeBuilder.scala @@ -5,7 +5,7 @@ import amf.core.client.scala.AMFResult import amf.core.client.scala.model.document.BaseUnit import org.mulesoft.als.logger.Logger import org.mulesoft.amfintegration.AmfImplicits.BaseUnitImp -import org.mulesoft.amfintegration.amfconfiguration.{AmfParseContext, AmfParseResult, ProfileMatcher} +import org.mulesoft.amfintegration.amfconfiguration.{AmfParseContext, AmfParseResult, DocumentDefinition, ProfileMatcher} import org.mulesoft.amfintegration.dialect.dialects.ExternalFragmentDialect import org.mulesoft.amfintegration.relationships.{AliasInfo, RelationshipLink} import org.mulesoft.amfintegration.visitors.AmfElementVisitors @@ -16,12 +16,12 @@ import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.Future class ParsedMainFileTree( - val main: AMFResult, - private val innerNodeRelationships: Seq[RelationshipLink], - private val innerDocumentLinks: Map[String, Seq[DocumentLink]], - private val innerAliases: Seq[AliasInfo], - definedBy: Dialect, - private val parseContext: AmfParseContext + val main: AMFResult, + private val innerNodeRelationships: Seq[RelationshipLink], + private val innerDocumentLinks: Map[String, Seq[DocumentLink]], + private val innerAliases: Seq[AliasInfo], + documentDefinition: DocumentDefinition, + private val parseContext: AmfParseContext ) extends MainFileTree { private val units: mutable.Map[String, AMFResult] = mutable.Map.empty @@ -30,23 +30,23 @@ class ParsedMainFileTree( units .map(t => t._1 -> { - val definedBy = getDialectForBaseUnit(t._2.baseUnit) + val documentDefinition = getDefinitionForBaseUnit(t._2.baseUnit) ParsedUnit( new AmfParseResult( t._2, - definedBy, + documentDefinition, parseContext, t._1 ), inTree = true, - definedBy + documentDefinition ) } ) .toMap - private def getDialectForBaseUnit(baseUnit: BaseUnit): Dialect = - baseUnit.sourceSpec.flatMap(ProfileMatcher.dialect).getOrElse(ExternalFragmentDialect.dialect) + private def getDefinitionForBaseUnit(baseUnit: BaseUnit): DocumentDefinition = + baseUnit.sourceSpec.flatMap(ProfileMatcher.dialect).getOrElse(DocumentDefinition(ExternalFragmentDialect.dialect)) override def references: Map[String, Seq[DocumentLink]] = documentLinks @@ -64,36 +64,40 @@ class ParsedMainFileTree( override def aliases: Seq[AliasInfo] = innerAliases override val profiles: Map[String, ParsedUnit] = parseContext.state.profiles - .map(p => + .map(p => { + val definition = DocumentDefinition(p.definedBy) p.path -> ParsedUnit( - new AmfParseResult(AMFResult(p.model, Nil), p.definedBy, parseContext, p.path), + new AmfParseResult(AMFResult(p.model, Nil), definition, parseContext, p.path), false, - p.definedBy + definition ) + } ) .toMap override val dialects: Map[String, ParsedUnit] = parseContext.state.dialects - .map(d => + .map(d => { + val definition = DocumentDefinition(d) // should this be the meta dialect? d.identifier -> ParsedUnit( - new AmfParseResult(AMFResult(d, Nil), d, parseContext, d.identifier), + new AmfParseResult(AMFResult(d, Nil), definition, parseContext, d.identifier), false, - d + definition ) + } ) .toMap } object ParsedMainFileTree { def apply( - main: AMFResult, - nodeRelationships: Seq[RelationshipLink], - documentLinks: Map[String, Seq[DocumentLink]], - aliases: Seq[AliasInfo], - definedBy: Dialect, - parseContext: AmfParseContext + main: AMFResult, + nodeRelationships: Seq[RelationshipLink], + documentLinks: Map[String, Seq[DocumentLink]], + aliases: Seq[AliasInfo], + documentDefinition: DocumentDefinition, + parseContext: AmfParseContext ): ParsedMainFileTree = - new ParsedMainFileTree(main, nodeRelationships, documentLinks, aliases, definedBy, parseContext) + new ParsedMainFileTree(main, nodeRelationships, documentLinks, aliases, documentDefinition, parseContext) } object MainFileTreeBuilder { @@ -108,7 +112,7 @@ object MainFileTreeBuilder { visitors.getRelationshipsFromVisitors, visitors.getDocumentLinksFromVisitors, visitors.getAliasesFromVisitors, - amfParseResult.definedBy, + amfParseResult.documentDefinition, amfParseResult.context ) tree.index(refs) diff --git a/als-server/shared/src/main/scala/org/mulesoft/als/server/modules/workspace/ParsedUnit.scala b/als-server/shared/src/main/scala/org/mulesoft/als/server/modules/workspace/ParsedUnit.scala index c867c47a7b..9550a03102 100644 --- a/als-server/shared/src/main/scala/org/mulesoft/als/server/modules/workspace/ParsedUnit.scala +++ b/als-server/shared/src/main/scala/org/mulesoft/als/server/modules/workspace/ParsedUnit.scala @@ -3,11 +3,11 @@ package org.mulesoft.als.server.modules.workspace import amf.aml.client.scala.model.document.Dialect import org.mulesoft.amfintegration.AmfImplicits.BaseUnitImp import org.mulesoft.amfintegration.ErrorsCollected -import org.mulesoft.amfintegration.amfconfiguration.{AmfParseContext, AmfParseResult} +import org.mulesoft.amfintegration.amfconfiguration.{AmfParseContext, AmfParseResult, DocumentDefinition} import scala.concurrent.Future -case class ParsedUnit(parsedResult: AmfParseResult, inTree: Boolean, definedBy: Dialect) { +case class ParsedUnit(parsedResult: AmfParseResult, inTree: Boolean, documentDefinition: DocumentDefinition) { def toCU( next: Option[Future[CompilableUnit]], mf: Option[String], @@ -20,7 +20,7 @@ case class ParsedUnit(parsedResult: AmfParseResult, inTree: Boolean, definedBy: if (inTree) mf else None, isDirty, next, - definedBy, + documentDefinition, ErrorsCollected(parsedResult.result.results.toList), amfContext ) diff --git a/als-server/shared/src/main/scala/org/mulesoft/als/server/modules/workspace/WorkspaceParserRepository.scala b/als-server/shared/src/main/scala/org/mulesoft/als/server/modules/workspace/WorkspaceParserRepository.scala index 7cf038c937..91956b27ac 100644 --- a/als-server/shared/src/main/scala/org/mulesoft/als/server/modules/workspace/WorkspaceParserRepository.scala +++ b/als-server/shared/src/main/scala/org/mulesoft/als/server/modules/workspace/WorkspaceParserRepository.scala @@ -42,7 +42,7 @@ class WorkspaceParserRepository() extends Repository[ParsedUnit] { def updateUnit(result: AmfParseResult): Unit = { Logger.debug(s"Updating ${result.result.baseUnit.location()}", "WorkspaceParserRepository", "updateUnit") if (tree.contains(result.result.baseUnit.identifier)) throw new Exception("Cannot update an unit from the tree") - val unit = ParsedUnit(result, inTree = false, result.definedBy) + val unit = ParsedUnit(result, inTree = false, result.documentDefinition) updateUnit(result.result.baseUnit.identifier, unit) } diff --git a/als-server/shared/src/main/scala/org/mulesoft/als/server/workspace/command/IndexDialectCommandExecutor.scala b/als-server/shared/src/main/scala/org/mulesoft/als/server/workspace/command/IndexDialectCommandExecutor.scala index 7392a9ee6f..a14b205cc6 100644 --- a/als-server/shared/src/main/scala/org/mulesoft/als/server/workspace/command/IndexDialectCommandExecutor.scala +++ b/als-server/shared/src/main/scala/org/mulesoft/als/server/workspace/command/IndexDialectCommandExecutor.scala @@ -4,7 +4,7 @@ import amf.apicontract.client.scala.APIConfiguration import amf.core.internal.parser.YMapOps import org.mulesoft.als.server.protocol.textsync.IndexDialectParams import org.mulesoft.als.server.workspace.WorkspaceManager -import org.mulesoft.amfintegration.dialect.integration.BaseAlsDialectProvider +import org.mulesoft.amfintegration.dialect.integration.BaseAlsDefinitionsProvider import org.mulesoft.amfintegration.platform.AlsPlatformSecrets import org.yaml.model.YMap @@ -43,7 +43,7 @@ class IndexDialectCommandExecutor(workspaceManager: WorkspaceManager) .map(Future(_)) .getOrElse(loadFromEnv(param.uri)) .map(content => { - BaseAlsDialectProvider.indexDialect(param.uri, content) + BaseAlsDefinitionsProvider.indexDialect(param.uri, content) workspaceManager.editorConfiguration.withDialect(param.uri) }) diff --git a/als-server/shared/src/test/resources/diagnostics/project/api.raml.jsonld b/als-server/shared/src/test/resources/diagnostics/project/api.raml.jsonld index 8956b71057..bc426cc15e 100644 --- a/als-server/shared/src/test/resources/diagnostics/project/api.raml.jsonld +++ b/als-server/shared/src/test/resources/diagnostics/project/api.raml.jsonld @@ -5,7 +5,7 @@ "@type": [ "doc:APIContractProcessingData" ], -"apiContract:modelVersion": "3.10.0", +"apiContract:modelVersion": "3.11.0", "doc:transformed": true, "doc:sourceSpec": "RAML 1.0" }, diff --git a/als-server/shared/src/test/resources/diagnostics/project/isolated.raml.jsonld b/als-server/shared/src/test/resources/diagnostics/project/isolated.raml.jsonld index 6734718e35..7978de9090 100644 --- a/als-server/shared/src/test/resources/diagnostics/project/isolated.raml.jsonld +++ b/als-server/shared/src/test/resources/diagnostics/project/isolated.raml.jsonld @@ -5,7 +5,7 @@ "@type": [ "doc:APIContractProcessingData" ], -"apiContract:modelVersion": "3.10.0", +"apiContract:modelVersion": "3.11.0", "doc:transformed": true, "doc:sourceSpec": "RAML 1.0" }, diff --git a/als-server/shared/src/test/resources/serialization/abstract-declaration/main.jsonld b/als-server/shared/src/test/resources/serialization/abstract-declaration/main.jsonld index cc28a924d7..fae922e0ef 100644 --- a/als-server/shared/src/test/resources/serialization/abstract-declaration/main.jsonld +++ b/als-server/shared/src/test/resources/serialization/abstract-declaration/main.jsonld @@ -5,7 +5,7 @@ "@type": [ "doc:APIContractProcessingData" ], -"apiContract:modelVersion": "3.10.0", +"apiContract:modelVersion": "3.11.0", "doc:transformed": true, "doc:sourceSpec": "RAML 1.0" }, @@ -74,7 +74,7 @@ "@type": [ "doc:APIContractProcessingData" ], -"apiContract:modelVersion": "3.10.0", +"apiContract:modelVersion": "3.11.0", "doc:sourceSpec": "RAML 1.0" }, { diff --git a/als-server/shared/src/test/resources/suggestions/mcp/structure1/base.mcp.json b/als-server/shared/src/test/resources/suggestions/mcp/structure1/base.mcp.json new file mode 100644 index 0000000000..0e19385155 --- /dev/null +++ b/als-server/shared/src/test/resources/suggestions/mcp/structure1/base.mcp.json @@ -0,0 +1,5 @@ +{ + "protocolVersion": "2025-03-26", + "transport": "Streamable HTTP", + "*" +} \ No newline at end of file diff --git a/als-server/shared/src/test/resources/suggestions/mcp/structure1/complete.mcp.json b/als-server/shared/src/test/resources/suggestions/mcp/structure1/complete.mcp.json new file mode 100644 index 0000000000..f4bd3990ba --- /dev/null +++ b/als-server/shared/src/test/resources/suggestions/mcp/structure1/complete.mcp.json @@ -0,0 +1,73 @@ +{ + "name": "test-mcp-server", + "protocolVersion": "2024-11-05", + "capabilities": { + "tools": true, + "resources": true, + "prompts": true, + "logging": true + }, + "tools": [ + { + "name": "echo", + "description": "Echo back the provided text", + "inputSchema": { + "type": "object", + "properties": { + "text": { + "type": "string", + "description": "The text to echo back" + } + }, + "required": [ + "text" + ] + } + }, + {*}, + { + "name": "add", + "description": "Add two numbers together", + "inputSchema": { + "type": "object", + "properties": { + "a": { + "type": "number", + "description": "First number" + }, + "b": { + "type": "number", + "description": "Second number" + } + }, + "required": [ + "a", + "b" + ] + } + } + ], + "resources": [ + { + "uri": "test://example", + "name": "Example Resource", + "description": "A test resource", + "mimeType": "text/plain" + } + ], + "prompts": [ + { + "name": "greeting", + "description": "A friendly greeting prompt", + "arguments": [ + { + "name": "name", + "description": "Name to greet", + "required": true + } + ] + } + ], + "introspectedAt": "Thu Jun 05 09:38:22 PDT 2025", + "connectionStatus": "success" +} \ No newline at end of file diff --git a/als-server/shared/src/test/resources/suggestions/mcp/structure1/input-schema-type.mcp.json b/als-server/shared/src/test/resources/suggestions/mcp/structure1/input-schema-type.mcp.json new file mode 100644 index 0000000000..d03ac19aaf --- /dev/null +++ b/als-server/shared/src/test/resources/suggestions/mcp/structure1/input-schema-type.mcp.json @@ -0,0 +1,17 @@ +{ + "name": "test-mcp-server", + "protocolVersion": "2024-11-05", + "capabilities": { + "tools": true, + "resources": true, + "prompts": true, + "logging": true + }, + "tools": [ + { + "inputSchema": { + "type": "*" + } + } + ] +} \ No newline at end of file diff --git a/als-server/shared/src/test/resources/suggestions/mcp/structure1/tool-in-array.mcp.json b/als-server/shared/src/test/resources/suggestions/mcp/structure1/tool-in-array.mcp.json new file mode 100644 index 0000000000..1393a4215a --- /dev/null +++ b/als-server/shared/src/test/resources/suggestions/mcp/structure1/tool-in-array.mcp.json @@ -0,0 +1,7 @@ +{ + "protocolVersion": "2025-03-26", + "transport": "Streamable HTTP", + "tools": [ + * + ] +} \ No newline at end of file diff --git a/als-server/shared/src/test/resources/suggestions/mcp/structure1/tool.mcp.json b/als-server/shared/src/test/resources/suggestions/mcp/structure1/tool.mcp.json new file mode 100644 index 0000000000..3a907ad275 --- /dev/null +++ b/als-server/shared/src/test/resources/suggestions/mcp/structure1/tool.mcp.json @@ -0,0 +1,9 @@ +{ + "protocolVersion": "2025-03-26", + "transport": "Streamable HTTP", + "tools": [ + { + * + } + ] +} \ No newline at end of file diff --git a/als-server/shared/src/test/scala/org/mulesoft/als/server/modules/completion/mcp/MCPSuggestionTestServer.scala b/als-server/shared/src/test/scala/org/mulesoft/als/server/modules/completion/mcp/MCPSuggestionTestServer.scala new file mode 100644 index 0000000000..9d01d8713c --- /dev/null +++ b/als-server/shared/src/test/scala/org/mulesoft/als/server/modules/completion/mcp/MCPSuggestionTestServer.scala @@ -0,0 +1,10 @@ +package org.mulesoft.als.server.modules.completion.mcp + +import org.mulesoft.als.server.modules.completion.ServerSuggestionsTest + +trait MCPSuggestionTestServer extends ServerSuggestionsTest { + + def rootPath: String = "suggestions/mcp" + + def format: String = "MCP" +} diff --git a/als-server/shared/src/test/scala/org/mulesoft/als/server/modules/completion/mcp/MCPSuggestionsTests.scala b/als-server/shared/src/test/scala/org/mulesoft/als/server/modules/completion/mcp/MCPSuggestionsTests.scala new file mode 100644 index 0000000000..b1abee23b2 --- /dev/null +++ b/als-server/shared/src/test/scala/org/mulesoft/als/server/modules/completion/mcp/MCPSuggestionsTests.scala @@ -0,0 +1,26 @@ +package org.mulesoft.als.server.modules.completion.mcp + +import scala.concurrent.ExecutionContext + +class MCPSuggestionsTests extends MCPSuggestionTestServer { + + override implicit val executionContext = ExecutionContext.Implicits.global + + // todo: JsonLDInstanceDocuments currently do not contain Lexical information, cannot proceed with tooling + + test("base") { + runTest("structure1/base.mcp.json", Set.empty) // todo: add correct expected + } + test("tool object") { + runTest("structure1/tool.mcp.json", Set()) // todo: add correct expected + } + test("tool array") { + runTest("structure1/tool-in-array.mcp.json", Set()) // todo: add correct expected + } + test("input schema value") { + runTest("structure1/input-schema-type.mcp.json", Set()) // todo: add correct expected + } + test("complex") { + runTest("structure1/complete.mcp.json", Set()) // todo: add correct expected + } +} diff --git a/als-server/shared/src/test/scala/org/mulesoft/als/server/modules/diagnostic/CleanDiagnosticTreeTest.scala b/als-server/shared/src/test/scala/org/mulesoft/als/server/modules/diagnostic/CleanDiagnosticTreeTest.scala index 54b97b10e5..861a35da11 100644 --- a/als-server/shared/src/test/scala/org/mulesoft/als/server/modules/diagnostic/CleanDiagnosticTreeTest.scala +++ b/als-server/shared/src/test/scala/org/mulesoft/als/server/modules/diagnostic/CleanDiagnosticTreeTest.scala @@ -79,7 +79,7 @@ class CleanDiagnosticTreeTest extends AsyncFlatSpec { val manager = new DummyCleanDiagnosticTreeManager( Map( mainPath -> ALSConfigurationState( - EditorConfigurationState(Seq(dRL, mfRL), Nil, Nil, syntaxPlugin = Nil, validationPlugin = Nil), + EditorConfigurationState(Seq(dRL, mfRL), Nil, Nil, Nil, syntaxPlugin = Nil, validationPlugin = Nil), state, None ) @@ -108,6 +108,7 @@ class CleanDiagnosticTreeTest extends AsyncFlatSpec { configuration.resourceLoaders, Nil, Nil, + Nil, syntaxPlugin = Nil, validationPlugin = Nil ), @@ -135,7 +136,7 @@ class CleanDiagnosticTreeTest extends AsyncFlatSpec { Logger.withTelemetry(DummyTelemetryProvider) val emptyConfig: ALSConfigurationState = ALSConfigurationState( - EditorConfigurationState(Nil, Nil, Nil, syntaxPlugin = Nil, validationPlugin = Nil), + EditorConfigurationState(Nil, Nil, Nil, Nil, syntaxPlugin = Nil, validationPlugin = Nil), EmptyProjectConfigurationState, None ) diff --git a/als-server/shared/src/test/scala/org/mulesoft/als/server/modules/serialization/SerializationTest.scala b/als-server/shared/src/test/scala/org/mulesoft/als/server/modules/serialization/SerializationTest.scala index 554ac6d2a2..a0600b9a42 100644 --- a/als-server/shared/src/test/scala/org/mulesoft/als/server/modules/serialization/SerializationTest.scala +++ b/als-server/shared/src/test/scala/org/mulesoft/als/server/modules/serialization/SerializationTest.scala @@ -355,6 +355,95 @@ class SerializationTest extends LanguageServerBaseTest with ChangesWorkspaceConf } } + test("Request serialized model - simple MCP Json Schema Defined") { + val alsClient: MockAlsClientNotifier = new MockAlsClientNotifier + val serializationProps: SerializationProps[StringWriter] = + new SerializationProps[StringWriter](alsClient) { + override def newDocBuilder(prettyPrint: Boolean): DocBuilder[StringWriter] = + JsonOutputBuilder(prettyPrint) + } + withServer(buildServer(serializationProps)) { server => + val content = """{ + | "protocolVersion": "2025-03-26", + | "transport": "Streamable HTTP", + | "tools": [ + | { + | "name": "calculator", + | "description": "Calculator that is expects two numbers and an operator", + | "inputSchema": { + | "type": "object", + | "properties": { + | "operand1": { + | "type": "string", + | "description": "The first operand" + | }, + | "operand2": { + | "type": "string", + | "description": "The second operand" + | }, + | "operation": { + | "type": "string", + | "description": "The arithmetic operation to perform", + | "enum": [ + | "add", + | "subtract", + | "multiply", + | "divide" + | ] + | } + | }, + | "required": [ + | "operand1", + | "operand2", + | "operation" + | ], + | "additionalProperties": false + | } + | } + | ], + | "resources": [ + | { + | "uri": "file://users.txt", + | "name": "users", + | "description": "", + | "mimeType": "", + | "annotations": { + | "audience": [], + | "priority": 0 + | } + | } + | ], + | "prompts": [ + | { + | "name": "Test", + | "description": "A test description", + | "arguments": [ + | { + | "name": "Name", + | "description": "Your Name", + | "required": true + | }, + | { + | "name": "Age", + | "description": "Your Age", + | "required": false + | } + | ] + | } + | ] + |}""".stripMargin + + val api = "file://api.mcp.json" + for { + _ <- openFile(server)(api, content) + _ <- alsClient.nextCall.map(_.model.toString) + s <- serialize(server, api, serializationProps, clean = true, sourcemaps = true) + } yield { + assert(s.contains("\"doc:sourceSpec\": \"MCP\"")) + } + } + } + test("GraphQL test", Flaky) { val alsClient: MockAlsClientNotifier = new MockAlsClientNotifier val serializationProps: SerializationProps[StringWriter] = diff --git a/als-server/shared/src/test/scala/org/mulesoft/als/server/workspace/WorkspaceParserRepositoryTest.scala b/als-server/shared/src/test/scala/org/mulesoft/als/server/workspace/WorkspaceParserRepositoryTest.scala index 9d4169bad0..eebb73a3e9 100644 --- a/als-server/shared/src/test/scala/org/mulesoft/als/server/workspace/WorkspaceParserRepositoryTest.scala +++ b/als-server/shared/src/test/scala/org/mulesoft/als/server/workspace/WorkspaceParserRepositoryTest.scala @@ -4,12 +4,7 @@ import amf.core.client.scala.AMFResult import amf.core.client.scala.model.document.BaseUnit import org.mulesoft.als.server.modules.workspace.{ParsedUnit, WorkspaceParserRepository} import org.mulesoft.amfintegration.AmfImplicits.BaseUnitImp -import org.mulesoft.amfintegration.amfconfiguration.{ - ALSConfigurationState, - AmfParseResult, - EditorConfiguration, - EmptyProjectConfigurationState -} +import org.mulesoft.amfintegration.amfconfiguration.{ALSConfigurationState, AmfParseResult, DocumentDefinition, EditorConfiguration, EmptyProjectConfigurationState} import org.mulesoft.amfintegration.dialect.dialects.ExternalFragmentDialect import org.mulesoft.amfintegration.platform.AlsPlatformSecrets import org.scalatest.funsuite.AsyncFunSuite @@ -98,7 +93,7 @@ class WorkspaceParserRepositoryTest apiPU.parsedResult.result.results ) // this `result.result.results` looks hideous, i know - r.updateUnit(new AmfParseResult(moddedBU, ExternalFragmentDialect(), apiPU.parsedResult.context, api.uri)) + r.updateUnit(new AmfParseResult(moddedBU, DocumentDefinition(ExternalFragmentDialect()), apiPU.parsedResult.context, api.uri)) val moddedPU = getParsedUnitOrFail(r, "file://newLocation/api.raml") assert( moddedPU.parsedResult.result.baseUnit.id == apiPU.parsedResult.result.baseUnit.id diff --git a/als-structure/shared/src/main/scala/org/mulesoft/language/outline/structure/structureImpl/StructureBuilder.scala b/als-structure/shared/src/main/scala/org/mulesoft/language/outline/structure/structureImpl/StructureBuilder.scala index 1255b4e9bd..a8fddd1649 100644 --- a/als-structure/shared/src/main/scala/org/mulesoft/language/outline/structure/structureImpl/StructureBuilder.scala +++ b/als-structure/shared/src/main/scala/org/mulesoft/language/outline/structure/structureImpl/StructureBuilder.scala @@ -3,18 +3,7 @@ package org.mulesoft.language.outline.structure.structureImpl import amf.aml.client.scala.model.document.{Dialect, DialectFragment, DialectLibrary, Vocabulary} import amf.apicontract.internal.metamodel.domain.api.WebApiModel import amf.apicontract.internal.metamodel.domain.templates.{ResourceTypeModel, TraitModel} -import amf.apicontract.internal.metamodel.domain.{ - EndPointModel, - OperationModel, - ParameterModel, - ParametersFieldModel, - PayloadModel, - RequestModel, - ResponseModel, - ServerModel, - TagModel, - TagsModel -} +import amf.apicontract.internal.metamodel.domain.{EndPointModel, OperationModel, ParameterModel, ParametersFieldModel, PayloadModel, RequestModel, ResponseModel, ServerModel, TagModel, TagsModel} import amf.core.client.scala.model.document.BaseUnit import amf.core.client.scala.model.domain.{AmfElement, DomainElement, ObjectNode} import amf.core.internal.metamodel.Field @@ -24,20 +13,12 @@ import amf.core.internal.metamodel.domain.extensions.{CustomDomainPropertyModel, import amf.core.internal.remote._ import amf.shapes.internal.domain.metamodel.CreativeWorkModel import org.mulesoft.language.outline.structure.structureImpl.SymbolKinds.SymbolKind -import org.mulesoft.language.outline.structure.structureImpl.factory.amlfactory.{ - AmlBuilderFactory, - AmlMetaDialectBuilderFactory, - AmlVocabularyBuilderFactory -} -import org.mulesoft.language.outline.structure.structureImpl.factory.webapi.{ - Async20BuilderFactory, - Oas20BuilderFactory, - Oas30BuilderFactory, - RamlBuilderFactory -} +import org.mulesoft.language.outline.structure.structureImpl.factory.amlfactory.{AmlBuilderFactory, AmlMetaDialectBuilderFactory, AmlVocabularyBuilderFactory} +import org.mulesoft.language.outline.structure.structureImpl.factory.webapi.{Async20BuilderFactory, Oas20BuilderFactory, Oas30BuilderFactory, RamlBuilderFactory} import amf.core.internal.metamodel.Type +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition -class StructureBuilder(unit: BaseUnit, definedBy: Dialect) { +class StructureBuilder(unit: BaseUnit, documentDefinition: DocumentDefinition) { // todo: general amf model dialect? private val factory: BuilderFactory = { @@ -55,7 +36,7 @@ class StructureBuilder(unit: BaseUnit, definedBy: Dialect) { } private val context = new StructureContextBuilder(unit) - .withDialect(definedBy) + .withDefinition(documentDefinition) .withFactory(factory) .build() // todo: change for default amf model dialect @@ -64,8 +45,8 @@ class StructureBuilder(unit: BaseUnit, definedBy: Dialect) { } object StructureBuilder { - def listSymbols(unit: BaseUnit, definedBy: Dialect): List[DocumentSymbol] = - new StructureBuilder(unit, definedBy).listSymbols() + def listSymbols(unit: BaseUnit, documentDefinition: DocumentDefinition): List[DocumentSymbol] = + new StructureBuilder(unit, documentDefinition).listSymbols() } object KindForResultMatcher { diff --git a/als-structure/shared/src/main/scala/org/mulesoft/language/outline/structure/structureImpl/StructureContext.scala b/als-structure/shared/src/main/scala/org/mulesoft/language/outline/structure/structureImpl/StructureContext.scala index 231ccb4b41..539be57e37 100644 --- a/als-structure/shared/src/main/scala/org/mulesoft/language/outline/structure/structureImpl/StructureContext.scala +++ b/als-structure/shared/src/main/scala/org/mulesoft/language/outline/structure/structureImpl/StructureContext.scala @@ -1,16 +1,16 @@ package org.mulesoft.language.outline.structure.structureImpl -import amf.aml.client.scala.model.document.Dialect import amf.core.client.scala.model.document.BaseUnit import org.mulesoft.amfintegration.AmfImplicits.BaseUnitImp +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition -class StructureContext(val location: String, val factory: BuilderFactory, val dialect: Dialect) {} +class StructureContext(val location: String, val factory: BuilderFactory, val documentDefinition: DocumentDefinition) {} private class StructureContextBuilder(unit: BaseUnit) { private var factory: BuilderFactory = _ - private var d: Dialect = _ + private var d: DocumentDefinition = _ - def withDialect(d: Dialect): StructureContextBuilder = { + def withDefinition(d: DocumentDefinition): StructureContextBuilder = { this.d = d this } diff --git a/als-structure/shared/src/main/scala/org/mulesoft/language/outline/structure/structureImpl/symbol/corebuilders/DeclaresFieldSymbolBuilder.scala b/als-structure/shared/src/main/scala/org/mulesoft/language/outline/structure/structureImpl/symbol/corebuilders/DeclaresFieldSymbolBuilder.scala index e8422a89b3..44667b6d10 100644 --- a/als-structure/shared/src/main/scala/org/mulesoft/language/outline/structure/structureImpl/symbol/corebuilders/DeclaresFieldSymbolBuilder.scala +++ b/als-structure/shared/src/main/scala/org/mulesoft/language/outline/structure/structureImpl/symbol/corebuilders/DeclaresFieldSymbolBuilder.scala @@ -23,7 +23,7 @@ class DeclaresFieldSymbolBuilder(override val value: AmfArray, override val elem override implicit val ctx: StructureContext ) extends ArrayFieldTypeSymbolBuilder { - private lazy val terms: Map[String, String] = ctx.dialect.declarationsMapTerms + private lazy val terms: Map[String, String] = ctx.documentDefinition.declarationsMapTerms private val groupedDeclarations: Map[String, Seq[AmfObject]] = value.values .collect({ diff --git a/als-structure/shared/src/test/scala/org/mulesoft/language/outline/test/BaseStructureTest.scala b/als-structure/shared/src/test/scala/org/mulesoft/language/outline/test/BaseStructureTest.scala index 2ab3f58d45..53158fd09a 100644 --- a/als-structure/shared/src/test/scala/org/mulesoft/language/outline/test/BaseStructureTest.scala +++ b/als-structure/shared/src/test/scala/org/mulesoft/language/outline/test/BaseStructureTest.scala @@ -2,14 +2,15 @@ package org.mulesoft.language.outline.test import amf.aml.client.scala.model.document.Dialect import amf.core.client.scala.model.document.BaseUnit +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition import org.mulesoft.language.outline.structure.structureImpl.{DocumentSymbol, StructureBuilder} import org.mulesoft.language.outline.test.DocumentSymbolNode._ import upickle.default.write abstract class BaseStructureTest extends OutlineTest[List[DocumentSymbol]] { - override def readDataFromAST(unit: BaseUnit, definedBy: Dialect): List[DocumentSymbol] = - StructureBuilder.listSymbols(unit, definedBy) + override def readDataFromAST(unit: BaseUnit, documentDefinition: DocumentDefinition): List[DocumentSymbol] = + StructureBuilder.listSymbols(unit, documentDefinition) override def writeDataToString(data: List[DocumentSymbol]): String = write[List[DocumentSymbolNode]](data.map(DocumentSymbolNode.sharedToTransport), 2) diff --git a/als-structure/shared/src/test/scala/org/mulesoft/language/outline/test/OutlineTest.scala b/als-structure/shared/src/test/scala/org/mulesoft/language/outline/test/OutlineTest.scala index 99ef4a1b24..bf2fbb34f1 100644 --- a/als-structure/shared/src/test/scala/org/mulesoft/language/outline/test/OutlineTest.scala +++ b/als-structure/shared/src/test/scala/org/mulesoft/language/outline/test/OutlineTest.scala @@ -7,11 +7,7 @@ import amf.core.client.scala.resource.ResourceLoader import amf.core.internal.remote.Platform import org.mulesoft.als.common.MarkerFinderTest import org.mulesoft.als.common.diff.FileAssertionTest -import org.mulesoft.amfintegration.amfconfiguration.{ - ALSConfigurationState, - EditorConfiguration, - EmptyProjectConfigurationState -} +import org.mulesoft.amfintegration.amfconfiguration.{ALSConfigurationState, DocumentDefinition, EditorConfiguration, EmptyProjectConfigurationState} import org.mulesoft.amfintegration.platform.AlsPlatformSecrets import org.scalatest.compatible.Assertion import org.scalatest.funsuite.AsyncFunSuite @@ -23,7 +19,7 @@ trait OutlineTest[T] extends AsyncFunSuite with FileAssertionTest with AlsPlatfo implicit override def executionContext: ExecutionContext = scala.concurrent.ExecutionContext.Implicits.global - def readDataFromAST(unit: BaseUnit, definedBy: Dialect): T + def readDataFromAST(unit: BaseUnit, documentDefinition: DocumentDefinition): T def writeDataToString(data: T): String @@ -70,7 +66,7 @@ trait OutlineTest[T] extends AsyncFunSuite with FileAssertionTest with AlsPlatfo // val fileContentsStr = content.stream.toString // configuration.withResourceLoader(loader(url, fileContentsStr)) - configuration.parse(url, asMain = true).map(cu => (cu.result.baseUnit, cu.definedBy)) + configuration.parse(url, asMain = true).map(cu => (cu.result.baseUnit, cu.documentDefinition)) }) .map { case (amfUnit, d) => diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/CompletionPluginsRegistryAML.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/CompletionPluginsRegistryAML.scala index bdbd5df8df..f33a7377b7 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/CompletionPluginsRegistryAML.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/CompletionPluginsRegistryAML.scala @@ -1,11 +1,13 @@ package org.mulesoft.als.suggestions -import amf.aml.client.scala.model.document.Dialect +import amf.shapes.client.scala.model.document.JsonSchemaDocument import org.mulesoft.als.suggestions.aml.AmlCompletionRequest import org.mulesoft.als.suggestions.interfaces.AMLCompletionPlugin import org.mulesoft.als.suggestions.plugins.aml.validationprofiles.ValidationProfileTermsSuggestions import org.mulesoft.als.suggestions.plugins.aml.webapi.extensions.OasLikeSemanticExtensionsFlavour import org.mulesoft.als.suggestions.plugins.aml.{StructureCompletionPlugin, _} +import org.mulesoft.als.suggestions.plugins.jsonschema.JsonSchemaStructureCompletionPlugin +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition import scala.collection.mutable import scala.concurrent.ExecutionContext.Implicits.global @@ -65,12 +67,18 @@ class CompletionsPluginHandler { mutable.Map() def pluginSuggestions(params: AmlCompletionRequest): Future[Seq[RawSuggestion]] = - getRegistryForDialect(params.actualDialect) + getRegistryForDefinition(params.actualDocumentDefinition) .suggests(params) - private def getRegistryForDialect(dialect: Dialect) = + private def getRegistryForDefinition(documentDefinition: DocumentDefinition) = registries - .getOrElse(dialect.id, AMLBaseCompletionPlugins.base) + .getOrElse(documentDefinition.baseUnit.id, getBasePluginsForDefinition(documentDefinition)) + + private def getBasePluginsForDefinition(documentDefinition: DocumentDefinition) = + documentDefinition.baseUnit match { + case _: JsonSchemaDocument => JsonSchemaBaseCompletionPlugins.base + case _ => AMLBaseCompletionPlugins.base + } def registerPlugin(plugin: AMLCompletionPlugin, dialect: String): Unit = registries.get(dialect) match { @@ -123,3 +131,20 @@ object AMLBaseCompletionPlugins { b } } + +object JsonSchemaBaseCompletionPlugins { + lazy val all: Seq[AMLCompletionPlugin] = CustomBaseCompletionPlugins.custom ++ Seq( + JsonSchemaStructureCompletionPlugin, + AMLRefTagCompletionPlugin, + AMLPathCompletionPlugin, + AMLBooleanPropertyValue, + AMLJsonSchemaStyleDeclarationReferences, + OasLikeSemanticExtensionsFlavour + ) + + val base: CompletionPluginsRegistryAML = { + val b = new CompletionPluginsRegistryAML + all.foreach(b.registerPlugin) + b + } +} diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/aml/AmlCompletionRequest.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/aml/AmlCompletionRequest.scala index 7ccc2c8cc3..6d87b53675 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/aml/AmlCompletionRequest.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/aml/AmlCompletionRequest.scala @@ -16,44 +16,44 @@ import org.mulesoft.als.suggestions.aml.declarations.DeclarationProvider import org.mulesoft.als.suggestions.interfaces.AMLCompletionPlugin import org.mulesoft.als.suggestions.styler.{SuggestionRender, SuggestionStylerBuilder} import org.mulesoft.amfintegration.AmfImplicits.BaseUnitImp -import org.mulesoft.amfintegration.amfconfiguration.ALSConfigurationState +import org.mulesoft.amfintegration.amfconfiguration.{ALSConfigurationState, DocumentDefinition} import org.mulesoft.common.client.lexical.{Position => AmfPosition} import org.yaml.lexer.YamlToken import org.yaml.model.YNode.MutRef import org.yaml.model._ class AmlCompletionRequest( - val baseUnit: BaseUnit, - val position: DtoPosition, - val actualDialect: Dialect, - val directoryResolver: DirectoryResolver, - val styler: SuggestionRender, - val astPartBranch: ASTPartBranch, - val configurationReader: AlsConfigurationReader, - private val objectInTree: ObjectInTree, - val inheritedProvider: Option[DeclarationProvider] = None, - val rootUri: Option[String], - val completionsPluginHandler: CompletionsPluginHandler, - val alsConfigurationState: ALSConfigurationState + val baseUnit: BaseUnit, + val position: DtoPosition, + val actualDocumentDefinition: DocumentDefinition, + val directoryResolver: DirectoryResolver, + val styler: SuggestionRender, + val astPartBranch: ASTPartBranch, + val configurationReader: AlsConfigurationReader, + private val objectInTree: ObjectInTree, + val inheritedProvider: Option[DeclarationProvider] = None, + val rootUri: Option[String], + val completionsPluginHandler: CompletionsPluginHandler, + val alsConfigurationState: ALSConfigurationState ) { lazy val branchStack: Seq[AmfObject] = objectInTree.stack lazy val amfObject: AmfObject = objectInTree.obj - val nodeDialect: Dialect = + val nodeDocumentDefinition: DocumentDefinition = objectInTree .objSpec(alsConfigurationState.findSemanticByName) .flatMap(alsConfigurationState.definitionFor) - .getOrElse(actualDialect) + .getOrElse(actualDocumentDefinition) - val currentNode: Option[NodeMapping] = DialectNodeFinder.find(objectInTree.obj, None, nodeDialect) + val currentNode: Option[NodeMapping] = DialectNodeFinder.find(objectInTree.obj, None, nodeDocumentDefinition) private def entryAndMapping: Option[(FieldEntry, Boolean)] = objectInTree.fieldValue .map(fe => (fe, false)) .orElse({ - FieldEntrySearcher(objectInTree.obj, currentNode, astPartBranch, actualDialect) + FieldEntrySearcher(objectInTree.obj, currentNode, astPartBranch, actualDocumentDefinition) .search(objectInTree.stack.headOption) }) @@ -67,7 +67,7 @@ class AmlCompletionRequest( val propertyMapping: List[PropertyMapping] = { val mappings: List[PropertyMapping] = currentNode match { case Some(nm: NodeMapping) => - PropertyMappingFilter(objectInTree, nodeDialect, nm).filter().toList + PropertyMappingFilter(objectInTree, nodeDocumentDefinition, nm).filter().toList case _ => Nil } @@ -87,13 +87,13 @@ class AmlCompletionRequest( } lazy val declarationProvider: DeclarationProvider = - inheritedProvider.getOrElse(DeclarationProvider(baseUnit, Some(actualDialect))) + inheritedProvider.getOrElse(DeclarationProvider(baseUnit, Some(actualDocumentDefinition))) - def withDialect(dialect: Dialect): AmlCompletionRequest = + def withDefinition(documentDefinition: DocumentDefinition): AmlCompletionRequest = new AmlCompletionRequest( this.baseUnit, this.position, - dialect, + documentDefinition, this.directoryResolver, this.styler, this.astPartBranch, @@ -110,15 +110,15 @@ class AmlCompletionRequest( object AmlCompletionRequestBuilder { def build( - baseUnit: BaseUnit, - position: AmfPosition, - dialect: Dialect, - directoryResolver: DirectoryResolver, - snippetSupport: Boolean, - rootLocation: Option[String], - configuration: AlsConfigurationReader, - completionsPluginHandler: CompletionsPluginHandler, - alsConfigurationState: ALSConfigurationState + baseUnit: BaseUnit, + position: AmfPosition, + documentDefinition: DocumentDefinition, + directoryResolver: DirectoryResolver, + snippetSupport: Boolean, + rootLocation: Option[String], + configuration: AlsConfigurationReader, + completionsPluginHandler: CompletionsPluginHandler, + alsConfigurationState: ALSConfigurationState ): AmlCompletionRequest = { val partBranch: ASTPartBranch = { NodeBranchBuilder @@ -145,12 +145,12 @@ object AmlCompletionRequestBuilder { new AmlCompletionRequest( baseUnit, dtoPosition, - dialect, + documentDefinition, directoryResolver, styler, partBranch, configuration, - objInTree(baseUnit, dialect, partBranch), + objInTree(baseUnit, documentDefinition, partBranch), rootUri = rootLocation, completionsPluginHandler = completionsPluginHandler, alsConfigurationState = alsConfigurationState @@ -160,8 +160,8 @@ object AmlCompletionRequestBuilder { objInTree knowledge could be used in other features, if we start keeping track of every branch in a Unit it could be a nice idea to have general cache for a `(BaseUnit, position) -> lazy objectInTree branch` (an ObjectInTreeManager) */ - private def objInTree(baseUnit: BaseUnit, definedBy: Dialect, astPartBranch: ASTPartBranch): ObjectInTree = { - val objectInTree = ObjectInTreeBuilder.fromUnit(baseUnit, baseUnit.identifier, definedBy, astPartBranch) + private def objInTree(baseUnit: BaseUnit, documentDefinition: DocumentDefinition, astPartBranch: ASTPartBranch): ObjectInTree = { + val objectInTree = ObjectInTreeBuilder.fromUnit(baseUnit, baseUnit.identifier, documentDefinition, astPartBranch) objectInTree.obj match { case d: EncodesModel if d.fields.exists(DocumentModel.Encodes) => ObjectInTree(d.encodes, Seq(objectInTree.obj) ++ objectInTree.stack, None, astPartBranch) @@ -247,13 +247,13 @@ object AmlCompletionRequestBuilder { element, parent.baseUnit.identifier, newStack, - parent.actualDialect, + parent.actualDocumentDefinition, parent.astPartBranch ) new AmlCompletionRequest( parent.baseUnit, parent.position, - parent.actualDialect, + parent.actualDocumentDefinition, parent.directoryResolver, parent.styler, parent.astPartBranch, diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/aml/FieldEntrySearcher.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/aml/FieldEntrySearcher.scala index befbfa8dc1..a92bd7eeb1 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/aml/FieldEntrySearcher.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/aml/FieldEntrySearcher.scala @@ -1,22 +1,22 @@ package org.mulesoft.als.suggestions.aml -import amf.aml.client.scala.model.document.Dialect import amf.aml.client.scala.model.domain.{NodeMapping, PropertyMapping} import amf.core.client.scala.model.domain.{AmfObject, AmfScalar} import amf.core.internal.parser.domain.{FieldEntry, Value} -import org.mulesoft.als.common.{ASTPartBranch, YPartBranch} -import org.mulesoft.amfintegration.AmfImplicits.{AmfObjectImp, DialectImplicits} +import org.mulesoft.als.common.ASTPartBranch +import org.mulesoft.amfintegration.AmfImplicits.AmfObjectImp +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition import scala.collection.immutable case class FieldEntrySearcher( - amfObject: AmfObject, - currentNode: Option[NodeMapping], - astPartBranch: ASTPartBranch, - actualDialect: Dialect + amfObject: AmfObject, + currentNode: Option[NodeMapping], + astPartBranch: ASTPartBranch, + actualDocumentDefinition: DocumentDefinition ) { val currentIds: immutable.Seq[String] = - amfObject.metaURIs.flatMap(uri => actualDialect.termsForId.find(_._2 == uri).map(_._1)) + amfObject.metaURIs.flatMap(uri => actualDocumentDefinition.termsForId.find(_._2 == uri).map(_._1)) private def findReferringProperty(mappings: Seq[PropertyMapping]) = mappings.filter(np => currentIds.exists(np.objectRange().map(_.value()).contains)) match { @@ -39,7 +39,7 @@ case class FieldEntrySearcher( def search(father: Option[AmfObject]): Option[(FieldEntry, Boolean)] = for { parent <- father - nm <- DialectNodeFinder.find(parent, None, actualDialect) + nm <- DialectNodeFinder.find(parent, None, actualDocumentDefinition) rp <- findReferringProperty(nm.propertiesMapping()) mm <- findValueFromTerm(rp) } yield (FieldEntry(mm.toField, Value(AmfScalar(""), amfObject.annotations)), true) diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/aml/PropertyMappingFilter.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/aml/PropertyMappingFilter.scala index 8059c764db..fa9d6f4e43 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/aml/PropertyMappingFilter.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/aml/PropertyMappingFilter.scala @@ -1,6 +1,5 @@ package org.mulesoft.als.suggestions.aml -import amf.aml.client.scala.model.document.Dialect import amf.aml.client.scala.model.domain.{NodeMapping, PropertyMapping} import amf.core.client.scala.model.document.BaseUnit import amf.core.client.scala.model.domain.AmfObject @@ -8,26 +7,26 @@ import amf.core.internal.metamodel.domain.common.{NameFieldSchema, NameFieldShac import amf.core.internal.parser.domain.FieldEntry import org.mulesoft.als.common.ObjectInTree import org.mulesoft.amfintegration.AmfImplicits.AmfObjectImp +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition -case class PropertyMappingFilter(objectInTree: ObjectInTree, actualDialect: Dialect, nm: NodeMapping) { +case class PropertyMappingFilter(objectInTree: ObjectInTree, actualDocumentDefinition: DocumentDefinition, nm: NodeMapping) { private def parentTermKey(): Seq[PropertyMapping] = objectInTree.stack.headOption - .flatMap(DialectNodeFinder.find(_, None, actualDialect)) + .flatMap(DialectNodeFinder.find(_, None, actualDocumentDefinition)) .collectFirst({ case n: NodeMapping => n }) .map(_.propertiesMapping()) .getOrElse(Nil) .filter(p => p.mapTermKeyProperty().option().isDefined) private def isInDeclarations(nm: NodeMapping): Boolean = - Option( - actualDialect - .documents() - .root() - ).exists(root => - root.declaredNodes().exists(_.mappedNode().option().contains(nm.id)) && objectInTree.stack.last - .isInstanceOf[BaseUnit] - ) + actualDocumentDefinition + .documents() + .flatMap(d => Option(d.root())) + .exists(root => + root.declaredNodes().exists(_.mappedNode().option().contains(nm.id)) && objectInTree.stack.last + .isInstanceOf[BaseUnit] + ) private val semanticNameIris: Seq[String] = Seq(NameFieldSchema.Name.value.iri(), NameFieldShacl.Name.value.iri()) @@ -57,10 +56,10 @@ case class PropertyMappingFilter(objectInTree: ObjectInTree, actualDialect: Dial } object DialectNodeFinder { - def find(amfObject: AmfObject, fieldEntry: Option[FieldEntry], actualDialect: Dialect): Option[NodeMapping] = { + def find(amfObject: AmfObject, fieldEntry: Option[FieldEntry], actualDocumentDefinition: DocumentDefinition): Option[NodeMapping] = { val elements = amfObject.metaURIs .flatMap { v => - actualDialect.declares.find { + actualDocumentDefinition.declares.find { case s: NodeMapping => s.nodetypeMapping.value() == v && containsAllFields(s, fieldEntry) case _ => false @@ -68,7 +67,7 @@ object DialectNodeFinder { } elements .collectFirst({ case nm: NodeMapping => nm }) - .orElse(findById(amfObject, fieldEntry, actualDialect)) + .orElse(findById(amfObject, fieldEntry, actualDocumentDefinition)) } private def containsAllFields(nodeMapping: NodeMapping, fieldEntry: Option[FieldEntry]): Boolean = { @@ -87,13 +86,13 @@ object DialectNodeFinder { /** Handles the case where the AML definition has no classTerm defined */ private def findById( - amfObject: AmfObject, - fieldEntry: Option[FieldEntry], - actualDialect: Dialect + amfObject: AmfObject, + fieldEntry: Option[FieldEntry], + actualDocumentDefinition: DocumentDefinition ): Option[NodeMapping] = { amfObject.metaURIs .flatMap { v => - actualDialect.declares.find { + actualDocumentDefinition.declares.find { case s: NodeMapping => s.id == v && containsAllFields(s, fieldEntry) case _ => false @@ -102,8 +101,8 @@ object DialectNodeFinder { .collectFirst({ case nm: NodeMapping => nm }) } - def find(metaUri: String, actualDialect: Dialect): Option[NodeMapping] = - actualDialect.declares + def find(metaUri: String, actualDocumentDefinition: DocumentDefinition): Option[NodeMapping] = + actualDocumentDefinition.declares .find { case s: NodeMapping => s.nodetypeMapping.value() == metaUri diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/aml/declarations/DeclarationProvider.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/aml/declarations/DeclarationProvider.scala index 291daa6c81..acfbe45103 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/aml/declarations/DeclarationProvider.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/aml/declarations/DeclarationProvider.scala @@ -8,6 +8,7 @@ import amf.core.internal.annotations.Aliases import amf.core.internal.metamodel.domain.DomainElementModel import org.mulesoft.als.common.SemanticNamedElement.ElementNameExtractor import org.mulesoft.amfintegration.AmfImplicits.AmfObjectImp +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition import scala.collection.mutable @@ -101,8 +102,8 @@ class DeclarationProvider(componentId: Option[String] = None) { } object DeclarationProvider { - def apply(bu: BaseUnit, d: Option[Dialect]): DeclarationProvider = { - val provider = new DeclarationProvider(d.flatMap(_.documents().declarationsPath().option())) + def apply(bu: BaseUnit, d: Option[DocumentDefinition]): DeclarationProvider = { + val provider = new DeclarationProvider(d.flatMap(_.documents()).flatMap(_.declarationsPath().option())) populateDeclarables(d, provider) @@ -127,9 +128,9 @@ object DeclarationProvider { } - private def populateDeclarables(d: Option[Dialect], provider: DeclarationProvider): Unit = { + private def populateDeclarables(d: Option[DocumentDefinition], provider: DeclarationProvider): Unit = { val declaredIds = d - .map(_.documents()) + .flatMap(_.documents()) .map(documents => { val libDec: Seq[String] = Option(documents.library()) .map(_.declaredNodes().flatMap(_.fields.fields()).map(_.value.toString)) diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/aml/jsonschema/JsonSchemaCompletionPluginRegistry.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/aml/jsonschema/JsonSchemaCompletionPluginRegistry.scala index 25739014d5..a6b8ee5708 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/aml/jsonschema/JsonSchemaCompletionPluginRegistry.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/aml/jsonschema/JsonSchemaCompletionPluginRegistry.scala @@ -3,7 +3,7 @@ import org.mulesoft.als.suggestions.AMLBaseCompletionPlugins import org.mulesoft.als.suggestions.aml.webapi.WebApiCompletionPluginRegistry import org.mulesoft.als.suggestions.interfaces.AMLCompletionPlugin import org.mulesoft.als.suggestions.plugins.aml.validationprofiles.ValidationProfileTermsSuggestions -import org.mulesoft.als.suggestions.plugins.aml.webapi.jsonSchema.{ +import org.mulesoft.als.suggestions.plugins.aml.webapi.jsonschema.{ JsonSchemaRefTag, JsonSchemaRequiredObjectCompletionPlugin, ResolveJsonSchemaRequiredProperties diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/client/Suggestions.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/client/Suggestions.scala index 1e152fa644..5855934772 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/client/Suggestions.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/client/Suggestions.scala @@ -13,7 +13,7 @@ import org.mulesoft.als.suggestions.aml.jsonschema.{JsonSchema2019CompletionPlug import org.mulesoft.als.suggestions.aml.webapi._ import org.mulesoft.als.suggestions.aml.{AmlCompletionRequestBuilder, MetaDialectPluginRegistry, VocabularyDialectPluginRegistry} import org.mulesoft.als.suggestions.interfaces.CompletionProvider -import org.mulesoft.amfintegration.amfconfiguration.{ALSConfigurationState, AmfParseContext} +import org.mulesoft.amfintegration.amfconfiguration.{ALSConfigurationState, AmfParseContext, DocumentDefinition} import org.mulesoft.amfintegration.dialect.dialects.ExternalFragmentDialect import org.mulesoft.lsp.feature.common.Position import org.mulesoft.lsp.feature.completion.CompletionItem @@ -69,7 +69,7 @@ class Suggestions( rootLocation: Option[String] ): CompletionProvider = { val content = result.unit.raw.getOrElse("") - result.definedBy match { + result.documentDefinition.baseUnit match { case ExternalFragmentDialect.dialect if isHeader(position, content) => if (!url.toLowerCase().endsWith(".raml")) HeaderCompletionProviderBuilder @@ -83,6 +83,8 @@ class Suggestions( else RamlHeaderCompletionProvider .build(url, content, DtoPosition(position, content)) + + // todo: case JSON Schema defined case d: Dialect if d.nameAndVersion() == "avro " && content.isEmpty => EmptyAvroCompletionProvider.build(url, LspRangeConverter.toLspPosition(DtoPosition(position, content)) @@ -90,7 +92,7 @@ class Suggestions( case _ => buildCompletionProviderAST( result.unit, - result.definedBy, + result.documentDefinition, DtoPosition(position, content), snippetSupport, rootLocation, @@ -109,12 +111,12 @@ class Suggestions( } private def buildCompletionProviderAST( - bu: BaseUnit, - dialect: Dialect, - pos: DtoPosition, - snippetSupport: Boolean, - rootLocation: Option[String], - alsConfiguration: ALSConfigurationState + bu: BaseUnit, + documentDefinition: DocumentDefinition, + pos: DtoPosition, + snippetSupport: Boolean, + rootLocation: Option[String], + alsConfiguration: ALSConfigurationState ): CompletionProviderAST = { val amfPosition: AmfPosition = pos.toAmfPosition @@ -123,7 +125,7 @@ class Suggestions( .build( bu, amfPosition, - dialect, + documentDefinition, directoryResolver, snippetSupport, rootLocation, @@ -135,4 +137,4 @@ class Suggestions( } } -case class UnitBundle(unit: BaseUnit, definedBy: Dialect, context: AmfParseContext) +case class UnitBundle(unit: BaseUnit, documentDefinition: DocumentDefinition, context: AmfParseContext) diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/interfaces/AMLCompletionPlugin.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/interfaces/AMLCompletionPlugin.scala index 941e7060b5..759b380484 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/interfaces/AMLCompletionPlugin.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/interfaces/AMLCompletionPlugin.scala @@ -1,12 +1,12 @@ package org.mulesoft.als.suggestions.interfaces -import amf.aml.client.scala.model.document.Dialect import amf.aml.client.scala.model.domain.NodeMapping import amf.core.client.scala.model.document.Fragment import amf.core.client.scala.model.domain.AmfObject import org.mulesoft.als.suggestions.RawSuggestion import org.mulesoft.als.suggestions.aml.AmlCompletionRequest import org.mulesoft.amfintegration.AmfImplicits.{AlsLexicalInformation, AmfObjectImp} +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition import scala.concurrent.Future @@ -15,11 +15,11 @@ trait AMLCompletionPlugin extends CompletionPlugin[AmlCompletionRequest] with Am } trait AmfObjectKnowledge { - protected def isEncodes(amfObject: AmfObject, dialect: Dialect, branchStack: Seq[AmfObject]): Boolean = { + protected def isEncodes(amfObject: AmfObject, documentDefinition: DocumentDefinition, branchStack: Seq[AmfObject]): Boolean = { val iri = amfObject.metaURIs.head - dialect.declares - .find(nm => dialect.documents().root().encoded().option().contains(nm.id)) + documentDefinition.declares + .find(nm => documentDefinition.documents().flatMap(_.root().encoded().option()).contains(nm.id)) .collectFirst({ case d: NodeMapping if d.nodetypeMapping.option().contains(iri) => d }) .isDefined || hasFragmentParent(branchStack) } diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/NonPatchHacks.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/NonPatchHacks.scala deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLComponentKeyCompletionPlugin.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLComponentKeyCompletionPlugin.scala index b041b1ced1..9b1311d58b 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLComponentKeyCompletionPlugin.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLComponentKeyCompletionPlugin.scala @@ -9,6 +9,7 @@ import org.mulesoft.als.suggestions.RawSuggestion import org.mulesoft.als.suggestions.aml.AmlCompletionRequest import org.mulesoft.als.suggestions.interfaces.AMLCompletionPlugin import org.mulesoft.amfintegration.AmfImplicits.AmfObjectImp +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition import scala.concurrent.Future @@ -19,35 +20,36 @@ object AMLComponentKeyCompletionPlugin extends AMLCompletionPlugin { Future.successful(resolvedSeq(params)) private def resolvedSeq(params: AmlCompletionRequest): Seq[RawSuggestion] = { - if (inRoot(params.amfObject, params.actualDialect) && params.astPartBranch.isKey) { - params.actualDialect + if (inRoot(params.amfObject, params.actualDocumentDefinition) && params.astPartBranch.isKey) { + params.actualDocumentDefinition .documents() - .declarationsPath() - .option() + .flatMap(_.declarationsPath() + .option()) .map(_.split('/').last) match { case Some(keyDeclarations) if isSonOf(keyDeclarations, params.astPartBranch) => - buildDeclaredKeys(params.actualDialect) + buildDeclaredKeys(params.actualDocumentDefinition) case _ => Seq() } } else Seq() } - private def inRoot(amfObject: AmfObject, dialect: Dialect): Boolean = { - dialect + private def inRoot(amfObject: AmfObject, documentDefinition: DocumentDefinition): Boolean = { + documentDefinition .documents() - .root() - .encoded() - .option() - .flatMap(id => dialect.declares.collectFirst({ case n: NodeMapping if id == n.id => n })) + .flatMap(_.root() + .encoded() + .option()) + .flatMap(id => documentDefinition.declares.collectFirst({ case n: NodeMapping if id == n.id => n })) .exists(i => amfObject.metaURIs.contains(i.nodetypeMapping.value())) || amfObject.isInstanceOf[Module] } - private def buildDeclaredKeys(dialect: Dialect) = { - dialect + private def buildDeclaredKeys(documentDefinition: DocumentDefinition) = { + documentDefinition .documents() - .root() - .declaredNodes() + .toSeq + .flatMap(_.root() + .declaredNodes()) .flatMap(node => node.name().option()) .map(RawSuggestion.forObject(_, "unknown")) } diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLJsonSchemaStyleDeclarationReferences.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLJsonSchemaStyleDeclarationReferences.scala index 8018ec9fd8..3d3ac4632a 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLJsonSchemaStyleDeclarationReferences.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLJsonSchemaStyleDeclarationReferences.scala @@ -1,6 +1,5 @@ package org.mulesoft.als.suggestions.plugins.aml -import amf.aml.client.scala.model.document.Dialect import amf.aml.client.scala.model.domain.NodeMapping import amf.apicontract.internal.metamodel.domain.templates.{ResourceTypeModel, TraitModel} import amf.apicontract.internal.metamodel.domain.{MessageModel, RequestModel, ResponseModel} @@ -17,20 +16,21 @@ import org.mulesoft.als.suggestions.RawSuggestion import org.mulesoft.als.suggestions.aml.AmlCompletionRequest import org.mulesoft.als.suggestions.aml.declarations.DeclarationProvider import org.mulesoft.amfintegration.AmfImplicits.AmfAnnotationsImp +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.Future class AMLJsonSchemaStyleDeclarationReferences( - dialect: Dialect, - ids: Seq[String], - actualName: Option[String], - astPartBranch: ASTPartBranch, - iriToPath: Map[String, String] + documentDefinition: DocumentDefinition, + ids: Seq[String], + actualName: Option[String], + astPartBranch: ASTPartBranch, + iriToPath: Map[String, String] ) { def resolve(dp: DeclarationProvider): Seq[RawSuggestion] = { - val declarationsPath = dialect.documents().declarationsPath().option().map(_ + "/").getOrElse("") + val declarationsPath = documentDefinition.documents().flatMap(_.declarationsPath().option()).map(_ + "/").getOrElse("") val routes = ids.flatMap { id => dp.forNodeType(id).filter(n => !actualName.contains(n)).map { name => nameForIri(id).fold(s"#/$name")(n => s"#/$declarationsPath$n/$name") @@ -52,10 +52,10 @@ trait AbstractAMLJsonSchemaStyleDeclarationReferences extends AMLDeclarationRefe override def id: String = "AMLJsonSchemaStyleDeclarationReferences" def applies(request: AmlCompletionRequest): Boolean = { - request.astPartBranch.isValue && request.astPartBranch.parentEntryIs("$ref") && request.actualDialect + request.astPartBranch.isValue && request.astPartBranch.parentEntryIs("$ref") && request.actualDocumentDefinition .documents() - .referenceStyle() - .option() + .flatMap(_.referenceStyle() + .option()) .forall(_ == ReferenceStyles.JSONSCHEMA) && isLocal(request.astPartBranch) } @@ -81,12 +81,13 @@ trait AbstractAMLJsonSchemaStyleDeclarationReferences extends AMLDeclarationRefe case _ => getObjectRangeIds(request) } - val mappings: Seq[NodeMapping] = request.actualDialect.declares.collect({ case n: NodeMapping => n }) + val mappings: Seq[NodeMapping] = request.actualDocumentDefinition.declares.collect({ case n: NodeMapping => n }) - val iriToPath: Map[String, String] = request.actualDialect + val iriToPath: Map[String, String] = request.actualDocumentDefinition .documents() - .root() - .declaredNodes() + .toSeq + .flatMap(_.root() + .declaredNodes()) .flatMap(dn => mappings .find(_.id == dn.mappedNode().value()) @@ -96,7 +97,7 @@ trait AbstractAMLJsonSchemaStyleDeclarationReferences extends AMLDeclarationRefe .toMap new AMLJsonSchemaStyleDeclarationReferences( - request.actualDialect, + request.actualDocumentDefinition, ids, actualName, request.astPartBranch, diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLKnownValueCompletionPlugin.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLKnownValueCompletionPlugin.scala index d2a1cd1886..59d61386aa 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLKnownValueCompletionPlugin.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLKnownValueCompletionPlugin.scala @@ -1,6 +1,5 @@ package org.mulesoft.als.suggestions.plugins.aml -import amf.aml.client.scala.model.document.Dialect import amf.apicontract.internal.metamodel.domain.ResponseModel import amf.core.internal.metamodel.Field import amf.core.internal.metamodel.Type.{ArrayLike, Scalar} @@ -9,22 +8,23 @@ import org.mulesoft.als.suggestions.aml.AmlCompletionRequest import org.mulesoft.als.suggestions.interfaces.AMLCompletionPlugin import org.mulesoft.als.suggestions.plugins.aml.patched.{PatchedSuggestion, PatchedSuggestionsForDialect} import org.mulesoft.amfintegration.AmfImplicits._ +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition import org.mulesoft.amfintegration.dialect.dialects.oas.OAS30Dialect import scala.concurrent.Future sealed class AMLKnownValueCompletions( - field: Field, - classTerm: String, - dialect: Dialect, - isKey: Boolean, - inArray: Boolean, - obj: Boolean + field: Field, + classTerm: String, + documentDefinition: DocumentDefinition, + isKey: Boolean, + inArray: Boolean, + obj: Boolean ) { private def getSuggestions: Seq[PatchedSuggestion] = PatchedSuggestionsForDialect - .getKnownValues(dialect.id, classTerm, field.toString) + .getKnownValues(documentDefinition.baseUnit.id, classTerm, field.toString) def resolve(): Future[Seq[RawSuggestion]] = Future.successful({ @@ -53,7 +53,7 @@ sealed class AMLKnownValueCompletions( if ( (field == ResponseModel.StatusCode || field == ResponseModel.Name) && input.forall( _.isDigit - ) && dialect.id != OAS30Dialect.dialect.id + ) && documentDefinition.baseUnit.id != OAS30Dialect.dialect.id ) // hack for oas 3.0 status codes NumberScalarRange else StringScalarRange @@ -92,7 +92,7 @@ trait AbstractKnownValueCompletionPlugin extends AMLCompletionPlugin { new AMLKnownValueCompletions( field, classTerm, - params.actualDialect, + params.actualDocumentDefinition, params.astPartBranch.isKey, // todo: check if the alternative "if strict" is still necessary or just a leftover from json patcher params.astPartBranch.isArray || (params.astPartBranch.strict && params.astPartBranch.isInArray), diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLPathCompletionPlugin.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLPathCompletionPlugin.scala index 4a26973c28..210782ff4a 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLPathCompletionPlugin.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLPathCompletionPlugin.scala @@ -37,9 +37,9 @@ object AMLPathCompletionPlugin extends AMLCompletionPlugin { private def ramlOrJsonInclusion(params: AmlCompletionRequest) = { params.astPartBranch match { case yPartBranch: YPartBranch => - DialectKnowledge.isRamlInclusion(yPartBranch, params.nodeDialect) || DialectKnowledge.isJsonInclusion( + DialectKnowledge.isRamlInclusion(yPartBranch, params.nodeDocumentDefinition) || DialectKnowledge.isJsonInclusion( yPartBranch, - params.nodeDialect + params.nodeDocumentDefinition ) case _ => false } diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLRamlStyleDeclarationsReferences.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLRamlStyleDeclarationsReferences.scala index 17572b7a28..4677fdb022 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLRamlStyleDeclarationsReferences.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLRamlStyleDeclarationsReferences.scala @@ -16,6 +16,7 @@ import org.mulesoft.als.suggestions.aml.AmlCompletionRequest import org.mulesoft.als.suggestions.aml.declarations.DeclarationProvider import org.mulesoft.als.suggestions.interfaces.AMLCompletionPlugin import org.mulesoft.amfintegration.AmfImplicits._ +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition import org.mulesoft.common.client.lexical.ASTElement import org.yaml.model.YMapEntry @@ -66,7 +67,7 @@ object AMLRamlStyleDeclarationsReferences extends AMLDeclarationReferences { override def resolve(params: AmlCompletionRequest): Future[Seq[RawSuggestion]] = Future.successful({ - if (params.astPartBranch.isValue && styleOrEmpty(params.actualDialect)) { + if (params.astPartBranch.isValue && styleOrEmpty(params.actualDocumentDefinition)) { val actualName = params.amfObject.elementIdentifier() new AMLRamlStyleDeclarationsReferences( getObjectRangeIds(params), @@ -77,8 +78,8 @@ object AMLRamlStyleDeclarationsReferences extends AMLDeclarationReferences { } else Seq.empty }) - private def styleOrEmpty(dialect: Dialect) = - dialect.documents().referenceStyle().option().forall(_ == ReferenceStyles.RAML) + private def styleOrEmpty(documentDefinition: DocumentDefinition) = + documentDefinition.documents().flatMap(_.referenceStyle().option()).forall(_ == ReferenceStyles.RAML) } diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLRefTagCompletionPlugin.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLRefTagCompletionPlugin.scala index a66d65f6f9..2b68a10e71 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLRefTagCompletionPlugin.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLRefTagCompletionPlugin.scala @@ -31,7 +31,7 @@ trait AMLRefTagCompletionPlugin extends AMLCompletionPlugin { override def resolve(request: AmlCompletionRequest): Future[Seq[RawSuggestion]] = Future { - getSuggestion(request, Option(request.nodeDialect.documents()).flatMap(_.referenceStyle().option())) + getSuggestion(request, request.nodeDocumentDefinition.documents().flatMap(_.referenceStyle().option())) } private def isDeclarable(params: AmlCompletionRequest): Boolean = diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLRootDeclarationsCompletionPlugin.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLRootDeclarationsCompletionPlugin.scala index 830cf9cdea..10e99dce39 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLRootDeclarationsCompletionPlugin.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLRootDeclarationsCompletionPlugin.scala @@ -21,38 +21,39 @@ class AMLRootDeclarationsCompletionPlugin(params: AmlCompletionRequest) { private def getSuggestions: Seq[(String, String)] = params.baseUnit match { - case _: DeclaresModel if params.actualDialect.documents().declarationsPath().option().isDefined => - params.actualDialect + case _: DeclaresModel if params.actualDocumentDefinition.documents().flatMap(_.declarationsPath().option()).isDefined => + params.actualDocumentDefinition .documents() - .declarationsPath() - .option() + .flatMap(_ + .declarationsPath() + .option()) .map(v => (v, "\n ")) .toSeq // todo: should this be indentation from config? case _: DeclaresModel => params.baseUnit match { case _: DialectInstanceLibrary | _: Module => - params.actualDialect + params.actualDocumentDefinition .documents() - .library() - .declaredNodes() + .toSeq + .flatMap(_.root().declaredNodes()) .map(extractText) case _ => - params.actualDialect + params.actualDocumentDefinition .documents() - .root() - .declaredNodes() + .toSeq + .flatMap(_.root().declaredNodes()) .map(extractText) } case _ => Nil } def usesSuggestion(): Option[(String, String)] = - params.actualDialect.documents().fields.getValueAsOption(DocumentsModelModel.Library).map(_ => ("uses", "\n ")) + params.actualDocumentDefinition.documents().flatMap(_.fields.getValueAsOption(DocumentsModelModel.Library)).map(_ => ("uses", "\n ")) def resolve(classTerm: String): Future[Seq[RawSuggestion]] = Future { (getSuggestions ++ usesSuggestion()) - .map(s => RawSuggestion.forObject(s._1, CategoryRegistry(classTerm, s._1, params.actualDialect.id))) + .map(s => RawSuggestion.forObject(s._1, CategoryRegistry(classTerm, s._1, params.actualDocumentDefinition.baseUnit.id))) } } diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLStructureCompletionPlugin.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLStructureCompletionPlugin.scala index 23ce9b0141..ded2899437 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLStructureCompletionPlugin.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLStructureCompletionPlugin.scala @@ -1,6 +1,5 @@ package org.mulesoft.als.suggestions.plugins.aml -import amf.aml.client.scala.model.document.Dialect import amf.aml.client.scala.model.domain.{NodeMapping, PropertyMapping} import amf.core.client.scala.model.document.Module import amf.core.internal.metamodel.Field @@ -14,13 +13,14 @@ import org.mulesoft.als.suggestions.plugins.aml.categories.CategoryRegistry import org.mulesoft.als.suggestions.plugins.aml.templates.{AMLDeclaredStructureTemplate, AMLEncodedStructureTemplate} import org.mulesoft.als.suggestions.plugins.aml.webapi.async.Async2PayloadExampleMatcher import org.mulesoft.amfintegration.AmfImplicits._ +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.Future -class AMLStructureCompletionsPlugin(propertyMapping: Seq[PropertyMapping], d: Dialect) { +class AMLStructureCompletionsPlugin(propertyMapping: Seq[PropertyMapping], d: DocumentDefinition) { def resolve(classTerm: String): Seq[RawSuggestion] = - propertyMapping.map(p => p.toRaw(CategoryRegistry(classTerm, p.name().value(), d.id))) + propertyMapping.map(p => p.toRaw(CategoryRegistry(classTerm, p.name().value(), d.baseUnit.id))) } case class StructureCompletionPlugin(resolvers: List[ResolveIfApplies]) extends DisjointCompletionPlugins { @@ -35,7 +35,7 @@ object ResolveDefault extends ResolveIfApplies with AmfObjectKnowledge with Asyn if (params.astPartBranch.isKeyLike && !isExampleAtPayload(params)) if (!isInFieldValue(params)) { val isEncoded = - isEncodes(params.amfObject, params.actualDialect, params.branchStack) && isEmptyFieldOrPrefix( + isEncodes(params.amfObject, params.actualDocumentDefinition, params.branchStack) && isEmptyFieldOrPrefix( params ) val isEncodedOrModule = isEncoded || params.amfObject.isInstanceOf[Module] @@ -43,7 +43,7 @@ object ResolveDefault extends ResolveIfApplies with AmfObjectKnowledge with Asyn ((isEncodedOrModule && params.astPartBranch.isAtRoot) || !isEncodedOrModule) && isEmptyFieldOrPrefix(params) ) - new AMLStructureCompletionsPlugin(params.propertyMapping, params.actualDialect) + new AMLStructureCompletionsPlugin(params.propertyMapping, params.actualDocumentDefinition) .resolve(params.amfObject.metaURIs.head) ++ AMLEncodedStructureTemplate.resolve(params) else @@ -69,13 +69,13 @@ object ResolveDefault extends ResolveIfApplies with AmfObjectKnowledge with Asyn protected def resolveObjInArray(params: AmlCompletionRequest): Seq[RawSuggestion] = { objInArray(params) match { case Some(meta) => - val props = params.actualDialect.declares + val props = params.actualDocumentDefinition.declares .collect({ case nm: NodeMapping => nm }) .find(_.nodetypeMapping.value() == meta.`type`.head.iri()) .map(_.propertiesMapping()) .getOrElse(Nil) - new AMLStructureCompletionsPlugin(props, params.actualDialect).resolve(meta.`type`.head.iri()) + new AMLStructureCompletionsPlugin(props, params.actualDocumentDefinition).resolve(meta.`type`.head.iri()) case _ => Nil } } diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLUnionDiscriminatorCompletionPlugin.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLUnionDiscriminatorCompletionPlugin.scala index f5e456be4e..6204e90639 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLUnionDiscriminatorCompletionPlugin.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLUnionDiscriminatorCompletionPlugin.scala @@ -1,11 +1,11 @@ package org.mulesoft.als.suggestions.plugins.aml -import amf.aml.client.scala.model.document.Dialect import amf.core.client.scala.model.domain.AmfObject import org.mulesoft.als.common.YPartBranch import org.mulesoft.als.suggestions.RawSuggestion import org.mulesoft.als.suggestions.aml.AmlCompletionRequest import org.mulesoft.als.suggestions.interfaces.AMLCompletionPlugin +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.Future @@ -30,7 +30,7 @@ class AMLUnionDiscriminatorCompletionPlugin( override protected val yPartBranch: YPartBranch ) extends UnionSuggestions { override protected val amfObject: AmfObject = params.amfObject - override protected val dialect: Dialect = params.actualDialect + override protected val documentDefinition: DocumentDefinition = params.actualDocumentDefinition def resolve(): Seq[RawSuggestion] = { unionType.flatMap(unionMapping => { diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLUnionNodeCompletionPlugin.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLUnionNodeCompletionPlugin.scala index c50129468a..010be7d5d3 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLUnionNodeCompletionPlugin.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLUnionNodeCompletionPlugin.scala @@ -1,6 +1,5 @@ package org.mulesoft.als.suggestions.plugins.aml -import amf.aml.client.scala.model.document.Dialect import amf.aml.client.scala.model.domain.{DialectDomainElement, UnionNodeMapping} import amf.aml.internal.annotations.DiscriminatorField import amf.core.client.scala.model.domain.AmfObject @@ -8,6 +7,7 @@ import org.mulesoft.als.common.YPartBranch import org.mulesoft.als.suggestions.RawSuggestion import org.mulesoft.als.suggestions.aml.AmlCompletionRequest import org.mulesoft.als.suggestions.interfaces.ResolveIfApplies +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.Future @@ -24,7 +24,7 @@ object AMLUnionNodeCompletionPlugin extends ResolveIfApplies { class AMLUnionNodeCompletionPlugin(params: AmlCompletionRequest, override protected val yPartBranch: YPartBranch) extends UnionSuggestions { override protected val amfObject: AmfObject = params.amfObject - override protected val dialect: Dialect = params.actualDialect + override protected val documentDefinition: DocumentDefinition = params.actualDocumentDefinition // this plugin applies when we are on a union with no type discriminator or the type discriminator is not set def resolve(): Option[Future[Seq[RawSuggestion]]] = diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLUnionRangeCompletionPlugin.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLUnionRangeCompletionPlugin.scala index 96d2903038..56fdbdfb9f 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLUnionRangeCompletionPlugin.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/AMLUnionRangeCompletionPlugin.scala @@ -8,6 +8,7 @@ import org.mulesoft.als.common.YPartBranch import org.mulesoft.als.suggestions.RawSuggestion import org.mulesoft.als.suggestions.aml.AmlCompletionRequest import org.mulesoft.als.suggestions.interfaces.ResolveIfApplies +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.Future @@ -24,7 +25,7 @@ object AMLUnionRangeCompletionPlugin extends ResolveIfApplies { class AMLUnionRangeCompletionPlugin(params: AmlCompletionRequest, override protected val yPartBranch: YPartBranch) extends UnionSuggestions { override protected val amfObject: AmfObject = params.amfObject - override protected val dialect: Dialect = params.actualDialect + override protected val documentDefinition: DocumentDefinition = params.actualDocumentDefinition lazy val possibleMappings: Seq[String] = fromUnionRangeMapping(amfObject) diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/UnionSuggestions.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/UnionSuggestions.scala index 32461940f5..c436bd550c 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/UnionSuggestions.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/UnionSuggestions.scala @@ -1,21 +1,21 @@ package org.mulesoft.als.suggestions.plugins.aml -import amf.aml.client.scala.model.document.Dialect import amf.aml.client.scala.model.domain._ import amf.aml.internal.annotations.FromUnionNodeMapping import amf.core.client.scala.model.StrField import amf.core.client.scala.model.domain.{AmfObject, DomainElement} import org.mulesoft.als.common.YPartBranch import org.mulesoft.amfintegration.AmfImplicits.AmfObjectImp +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition trait UnionSuggestions { protected val amfObject: AmfObject - protected val dialect: Dialect + protected val documentDefinition: DocumentDefinition protected val yPartBranch: YPartBranch private def getUnionTypeFromMeta: Option[UnionNodeMapping] = amfObject.metaURIs.flatMap { v => - dialect.declares.collectFirst({ + documentDefinition.declares.collectFirst({ case d: UnionNodeMapping if d.id == v => d }) }.headOption @@ -25,13 +25,13 @@ trait UnionSuggestions { private def getUnionTypeFromAnnotation: Option[UnionNodeMapping] = amfObject.annotations.find(classOf[FromUnionNodeMapping]).flatMap { ann: FromUnionNodeMapping => - dialect.declares.collectFirst({ + documentDefinition.declares.collectFirst({ case d: UnionNodeMapping if d.id == ann.id => d }) } protected def getDeclaredDomainElement(id: String): Option[DomainElement] = - dialect.declares.collectFirst({ + documentDefinition.declares.collectFirst({ case d if d.id == id => d }) diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/metadialect/MetaDialectDocumentsCompletionPlugin.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/metadialect/MetaDialectDocumentsCompletionPlugin.scala index eb01567feb..20e7a90500 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/metadialect/MetaDialectDocumentsCompletionPlugin.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/metadialect/MetaDialectDocumentsCompletionPlugin.scala @@ -1,6 +1,5 @@ package org.mulesoft.als.suggestions.plugins.aml.metadialect -import amf.aml.client.scala.model.document.Dialect import amf.aml.client.scala.model.domain.{DocumentsModel, NodeMapping} import amf.core.client.scala.model.domain.AmfObject import amf.core.client.scala.vocabulary.Namespace.XsdTypes @@ -11,6 +10,7 @@ import org.mulesoft.als.suggestions.aml.AmlCompletionRequest import org.mulesoft.als.suggestions.interfaces.ResolveIfApplies import org.mulesoft.als.suggestions.plugins.aml.{AMLStructureCompletionsPlugin, BooleanSuggestions, EnumSuggestions} import org.mulesoft.amfintegration.AmfImplicits.AmfObjectImp +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition import org.mulesoft.amfintegration.dialect.dialects.metadialect.{DocumentsObjectNode, MetaDialect} import scala.concurrent.ExecutionContext.Implicits.global @@ -20,7 +20,7 @@ object MetaDialectDocumentsCompletionPlugin extends ResolveIfApplies with Boolea lazy val documents: Map[String, NodeMapping] = DocumentsObjectNode.properties.foldLeft(Map[String, NodeMapping]())({ case (acc, pm) => - getDeclaredNode(MetaDialect(), pm.objectRange().head.value()) + getDeclaredNode(DocumentDefinition(MetaDialect()), pm.objectRange().head.value()) .map(nm => acc + (pm.name().value() -> nm)) .getOrElse(acc) }) @@ -38,27 +38,27 @@ object MetaDialectDocumentsCompletionPlugin extends ResolveIfApplies with Boolea def getSuggestion(params: AmlCompletionRequest): Option[Future[Seq[RawSuggestion]]] = { if (params.astPartBranch.isKey) { - suggestDocumentKeys(params.amfObject, params.astPartBranch, params.actualDialect) + suggestDocumentKeys(params.amfObject, params.astPartBranch, params.actualDocumentDefinition) } else { params.fieldEntry.map(suggestValuesForDocumentKey(params.astPartBranch, _)) } } - def getDeclaredNode(dialect: Dialect, id: String): Option[NodeMapping] = - dialect.declares.collectFirst({ + def getDeclaredNode(documentDefinition: DocumentDefinition, id: String): Option[NodeMapping] = + documentDefinition.declares.collectFirst({ case declaration: NodeMapping if declaration.id == id => declaration }) def suggestDocumentKeys( - amfObject: AmfObject, - astPart: ASTPartBranch, - dialect: Dialect + amfObject: AmfObject, + astPart: ASTPartBranch, + documentDefinition: DocumentDefinition ): Option[Future[Seq[RawSuggestion]]] = { documents .collectFirst { case (key, mapping) if astPart.parentEntryIs(key) => mapping } .map(a => Future { - new AMLStructureCompletionsPlugin(a.propertiesMapping(), dialect).resolve(amfObject.metaURIs.head) + new AMLStructureCompletionsPlugin(a.propertiesMapping(), documentDefinition).resolve(amfObject.metaURIs.head) } ) } diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/metadialect/NodeUnionDeclarationCompletionPlugin.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/metadialect/NodeUnionDeclarationCompletionPlugin.scala index 069d1d295d..f44877a71b 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/metadialect/NodeUnionDeclarationCompletionPlugin.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/metadialect/NodeUnionDeclarationCompletionPlugin.scala @@ -8,6 +8,7 @@ import org.mulesoft.als.suggestions.RawSuggestion import org.mulesoft.als.suggestions.aml.AmlCompletionRequest import org.mulesoft.als.suggestions.interfaces.ResolveIfApplies import org.mulesoft.als.suggestions.plugins.aml.{PropertyMappingWrapper, UnionSuggestions} +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition import org.mulesoft.amfintegration.dialect.dialects.metadialect.{NodeMappingObjectNode, UnionMappingObjectNode} import scala.concurrent.ExecutionContext.Implicits.global @@ -28,7 +29,7 @@ class NodeUnionDeclarationCompletionPlugin( override protected val yPartBranch: YPartBranch ) extends UnionSuggestions { override protected val amfObject: AmfObject = params.amfObject - override protected val dialect: Dialect = params.actualDialect + override protected val documentDefinition: DocumentDefinition = params.actualDocumentDefinition def applies(): Boolean = params.astPartBranch.isKey && params.amfObject.isInstanceOf[NodeMapping] diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/package.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/package.scala index b65575297a..3e19c0894a 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/package.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/package.scala @@ -5,6 +5,7 @@ import amf.aml.client.scala.model.domain.{NodeMapping, PropertyMapping} import amf.core.client.scala.vocabulary.Namespace.XsdTypes.{xsdBoolean, xsdDouble, xsdFloat, xsdInteger} import org.mulesoft.als.suggestions._ import org.mulesoft.als.suggestions.plugins.aml.categories.CategoryRegistry +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition package object aml { @@ -23,13 +24,13 @@ package object aml { implicit class NodeMappingWrapper(nodeMapping: NodeMapping) { - def propertiesRaw(category: Option[String] = None, fromDialect: Dialect): Seq[RawSuggestion] = + def propertiesRaw(category: Option[String] = None, fromDefinition: DocumentDefinition): Seq[RawSuggestion] = nodeMapping .propertiesMapping() .filterNot(_.name().isNullOrEmpty) // todo: should centralize PropertyMappingFilter logic .map { p => val c = - category.getOrElse(CategoryRegistry(nodeMapping.nodetypeMapping.value(), p.name().value(), fromDialect.id)) + category.getOrElse(CategoryRegistry(nodeMapping.nodetypeMapping.value(), p.name().value(), fromDefinition.baseUnit.id)) p.toRaw(c) } diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/pathnavigation/DeclarablePathSuggestor.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/pathnavigation/DeclarablePathSuggestor.scala index 8f2b495e23..0d4c0b133c 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/pathnavigation/DeclarablePathSuggestor.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/pathnavigation/DeclarablePathSuggestor.scala @@ -9,6 +9,7 @@ import amf.shapes.client.scala.model.document.JsonSchemaDocument import amf.shapes.internal.annotations.DocumentDeclarationKey import org.mulesoft.als.suggestions.RawSuggestion import org.mulesoft.amfintegration.AmfImplicits.AmfObjectImp +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition import org.mulesoft.amfintegration.dialect.dialects.oas.OAS30Dialect import scala.concurrent.Future @@ -65,7 +66,7 @@ sealed case class ComponentSuggestor(component: ComponentModule, prefix: String, case named: NamedDomainElement if targetClass.forall(tc => named.metaURIs.contains(tc)) => for { componentsKey <- OAS30Dialect.dialect.documents().declarationsPath().option() - declaredKey <- named.declarableKey(OAS30Dialect.dialect) + declaredKey <- named.declarableKey(DocumentDefinition(OAS30Dialect.dialect)) name <- named.name.option() } yield { s"/$componentsKey/$declaredKey/$name" diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/pathnavigation/PathSuggestor.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/pathnavigation/PathSuggestor.scala index b2143b579c..fefdcbf78d 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/pathnavigation/PathSuggestor.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/pathnavigation/PathSuggestor.scala @@ -52,7 +52,7 @@ object PathSuggestor { } yield { cached match { case Some(schema: DeclaresModel) => DeclarablePathSuggestor(schema, prefix, targetClass) - case None => PathNavigation(fileUri, navPath, prefix, alsConfiguration, containsHashtag) + case _ => PathNavigation(fileUri, navPath, prefix, alsConfiguration, containsHashtag) } } } diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/templates/AMLDeclaredStructureTemplate.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/templates/AMLDeclaredStructureTemplate.scala index 6cea24dc53..a4a810f35e 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/templates/AMLDeclaredStructureTemplate.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/templates/AMLDeclaredStructureTemplate.scala @@ -14,10 +14,10 @@ object AMLDeclaredStructureTemplate { params.astPartBranch.isKey && TemplateTools.isInsideDeclaration(params) ) { - val decKey = params.nodeDialect.declarationsMapTerms + val decKey = params.nodeDocumentDefinition.declarationsMapTerms .find(t => params.astPartBranch.parentKey.contains(t._2)) .map(_._1) - val nm = decKey.flatMap(DialectNodeFinder.find(_, params.nodeDialect)) + val nm = decKey.flatMap(DialectNodeFinder.find(_, params.nodeDocumentDefinition)) val usedMappings = nm.map(_.propertiesMapping()).getOrElse(Seq.empty).filter(_.minCount().value() > 0) usedMappings.flatMap(TemplateTools.getFirstLevelTemplate(_, params)) match { case Nil => Seq.empty diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/templates/TemplateTools.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/templates/TemplateTools.scala index 8d8831d9a6..e82cbc77d5 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/templates/TemplateTools.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/templates/TemplateTools.scala @@ -9,6 +9,7 @@ import org.mulesoft.als.suggestions.aml.{AmlCompletionRequest, DialectNodeFinder import org.mulesoft.amfintegration.AmfImplicits.{AmfObjectImp, DialectImplicits} import org.yaml.model.YMapEntry import amf.core.internal.utils.InflectorBase.Inflector +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition object TemplateTools { val fullPrefix = "New full" @@ -16,11 +17,11 @@ object TemplateTools { val category = "template" private val defaultName = "element" - private def maybeDeclarableName(amfObject: AmfObject, dialect: Dialect): Option[String] = - amfObject.declarableKey(dialect) + private def maybeDeclarableName(amfObject: AmfObject, documentDefinition: DocumentDefinition): Option[String] = + amfObject.declarableKey(documentDefinition) private def getName(params: AmlCompletionRequest) = - maybeDeclarableName(params.amfObject, params.nodeDialect) + maybeDeclarableName(params.amfObject, params.nodeDocumentDefinition) .orElse(params.astPartBranch.parentKey) .map(_.singularize) .getOrElse(defaultName) @@ -59,7 +60,7 @@ object TemplateTools { def parentTermKey(params: AmlCompletionRequest): Option[PropertyMapping] = params.branchStack.headOption - .flatMap(DialectNodeFinder.find(_, None, params.actualDialect)) + .flatMap(DialectNodeFinder.find(_, None, params.actualDocumentDefinition)) .flatMap(_.propertiesMapping().find(_.mapTermKeyProperty().option().isDefined)) .filterNot(pm => params.amfObject.fields @@ -73,7 +74,7 @@ object TemplateTools { def isInsideDeclaration(params: AmlCompletionRequest): Boolean = params.astPartBranch.parentKey - .exists(k => params.nodeDialect.declarationsMapTerms.values.to[Seq].contains(k)) && + .exists(k => params.nodeDocumentDefinition.declarationsMapTerms.values.to[Seq].contains(k)) && hasCorrectDeclarationNesting(params) private def getRecursiveChildren( @@ -98,10 +99,10 @@ object TemplateTools { .map { _.value.value } .collect { case AmfArray(values, _) => values } .flatMap(_.collectFirst { case s: AmfScalar => s.toString }) - .map(mappingsForNode(_, params.actualDialect)) + .map(mappingsForNode(_, params.actualDocumentDefinition)) .getOrElse(Seq.empty) - private def mappingsForNode(nodeType: String, d: Dialect): Seq[PropertyMapping] = + private def mappingsForNode(nodeType: String, d: DocumentDefinition): Seq[PropertyMapping] = d.declares .find(de => de.id == nodeType) .collect { case nm: NodeMapping => nm.propertiesMapping() } @@ -168,7 +169,7 @@ object TemplateTools { } private def hasCorrectDeclarationNesting(params: AmlCompletionRequest) = - declarationPathForDialect(params.nodeDialect) match { + declarationPathForDefinition(params.nodeDocumentDefinition) match { case Some(dp) => params.astPartBranch.stack.drop(3).collectFirst { case e: YMapEntry => e } match { case Some(entry) => @@ -179,6 +180,6 @@ object TemplateTools { params.astPartBranch.stack.size <= 4 // document -> map -> entry -> (node of previous declaration) } - private def declarationPathForDialect(dialect: Dialect): Option[String] = - dialect.documents().declarationsPath().option() + private def declarationPathForDefinition(documentDefinition: DocumentDefinition): Option[String] = + documentDefinition.documents().flatMap(_.declarationsPath().option()) } diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/validationprofiles/ValidationProfileTermsSuggestions.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/validationprofiles/ValidationProfileTermsSuggestions.scala index c98f3ee254..5a995c7684 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/validationprofiles/ValidationProfileTermsSuggestions.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/validationprofiles/ValidationProfileTermsSuggestions.scala @@ -16,7 +16,7 @@ object ValidationProfileTermsSuggestions extends ResolveIfApplies { lazy val classMap: Future[Map[String, Seq[String]]] = { val dialect: Future[Dialect] = - AMFParser.parseContent(CanonicalApiDialect.yaml, AMLConfiguration.predefined()).map { r => + AMFParser.parseContent(CanonicalApiDialect.fileContent, AMLConfiguration.predefined()).map { r => r.baseUnit.asInstanceOf[Dialect] } @@ -66,7 +66,7 @@ object ValidationProfileTermsSuggestions extends ResolveIfApplies { } override def resolve(request: AmlCompletionRequest): Option[Future[Seq[RawSuggestion]]] = { - if (request.actualDialect.name().value() == "Validation Profile") { + if (request.actualDocumentDefinition.name().getOrElse("") == "Validation Profile") { if (request.astPartBranch.parentEntryIs("targetClass")) Some(suggestClasses()) else if (request.astPartBranch.isKeyDescendantOf("propertyConstraints")) Some(suggestProperties(request)) else notApply diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/AbstractRuntimeExpressionsCompletionPlugin.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/AbstractRuntimeExpressionsCompletionPlugin.scala index fabd5996c6..b9bcb5609c 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/AbstractRuntimeExpressionsCompletionPlugin.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/AbstractRuntimeExpressionsCompletionPlugin.scala @@ -20,8 +20,8 @@ abstract class AbstractRuntimeExpressionsCompletionPlugin extends AMLCompletionP protected def isApplicable(request: AmlCompletionRequest): Boolean = request.astPartBranch match { case yPartBranch: YPartBranch => - !(DialectKnowledge.isRamlInclusion(yPartBranch, request.actualDialect) || - DialectKnowledge.isJsonInclusion(yPartBranch, request.actualDialect)) && + !(DialectKnowledge.isRamlInclusion(yPartBranch, request.actualDocumentDefinition) || + DialectKnowledge.isJsonInclusion(yPartBranch, request.actualDocumentDefinition)) && appliesToField(request) case _ => false } diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/DeclaredTypesSuggestions.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/DeclaredTypesSuggestions.scala index cc633e2122..2b392dee5a 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/DeclaredTypesSuggestions.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/DeclaredTypesSuggestions.scala @@ -68,5 +68,5 @@ trait DeclaredTypesSuggestions extends BooleanSuggestions { // today the only case in which this applies is raml types on async2 // if any other case appears, check if this is still a valid mean to know if one can use declarations from other specs protected def canUseDeclared(params: AmlCompletionRequest): Boolean = - params.nodeDialect == params.actualDialect + params.nodeDocumentDefinition == params.actualDocumentDefinition } diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/ObjectExamplePropertiesCompletionPlugin.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/ObjectExamplePropertiesCompletionPlugin.scala index 66a70efd7a..9f2fa10259 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/ObjectExamplePropertiesCompletionPlugin.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/ObjectExamplePropertiesCompletionPlugin.scala @@ -1,6 +1,5 @@ package org.mulesoft.als.suggestions.plugins.aml.webapi -import amf.aml.client.scala.model.document.Dialect import amf.apicontract.internal.metamodel.domain.PayloadModel import amf.core.client.common.validation.{ProfileName, ProfileNames} import amf.core.client.scala.model.domain._ @@ -15,18 +14,18 @@ import org.mulesoft.als.suggestions.RawSuggestion import org.mulesoft.als.suggestions.aml.AmlCompletionRequest import org.mulesoft.als.suggestions.interfaces.AMLCompletionPlugin import org.mulesoft.amfintegration.LocalIgnoreErrorHandler -import org.mulesoft.amfintegration.amfconfiguration.ALSConfigurationState +import org.mulesoft.amfintegration.amfconfiguration.{ALSConfigurationState, DocumentDefinition} import org.mulesoft.amfintegration.dialect.dialects.oas.OAS20Dialect import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.Future case class ObjectExamplePropertiesCompletionPlugin( - node: DataNode, - dialect: Dialect, - override val anyShape: AnyShape, - example: Example, - override protected val alsConfigurationState: ALSConfigurationState + node: DataNode, + documentDefinition: DocumentDefinition, + override val anyShape: AnyShape, + example: Example, + override protected val alsConfigurationState: ALSConfigurationState ) extends ShapePropertiesSuggestions { override protected def shapeForObj: Option[NodeShape] = resolved.flatMap(findNode(_, example.structuredValue, node)) @@ -55,19 +54,19 @@ case class ObjectExamplePropertiesCompletionPlugin( trait ShapePropertiesSuggestions { val anyShape: AnyShape - protected val dialect: Dialect + protected val documentDefinition: DocumentDefinition protected def shapeForObj: Option[NodeShape] protected val alsConfigurationState: ALSConfigurationState def suggest(): Seq[RawSuggestion] = shapeForObj.map(_.properties.map(propToRaw)).getOrElse(Nil) private def profile: ProfileName = - if (dialect.id == OAS20Dialect.dialect.id) ProfileNames.OAS20 else ProfileNames.RAML10 + if (documentDefinition.baseUnit.id == OAS20Dialect.dialect.id) ProfileNames.OAS20 else ProfileNames.RAML10 // todo: use specific amf configuration for resolution? protected val resolved: Option[AnyShape] = new CompleteShapeTransformationPipeline(anyShape, LocalIgnoreErrorHandler, profile) - .transform(alsConfigurationState.configForDialect(dialect).config) match { + .transform(alsConfigurationState.configForDefinition(documentDefinition).config) match { case a: AnyShape => Some(a) case _ => None } @@ -83,9 +82,9 @@ trait ShapePropertiesSuggestions { } case class PureShapePropertiesSuggestions( - override val anyShape: AnyShape, - dialect: Dialect, - override protected val alsConfigurationState: ALSConfigurationState + override val anyShape: AnyShape, + documentDefinition: DocumentDefinition, + override protected val alsConfigurationState: ALSConfigurationState ) extends ShapePropertiesSuggestions { override protected def shapeForObj: Option[NodeShape] = resolved.collectFirst({ case n: NodeShape => n }) } @@ -105,7 +104,7 @@ trait ExampleSuggestionPluginBuilder { .filter(fe => fe.field == ExamplesField.Examples) .flatMap(_ => { isFatherShape(Some(request.amfObject)) - .map(s => PureShapePropertiesSuggestions(s, request.actualDialect, request.alsConfigurationState)) + .map(s => PureShapePropertiesSuggestions(s, request.actualDocumentDefinition, request.alsConfigurationState)) }) } @@ -116,7 +115,7 @@ trait ExampleSuggestionPluginBuilder { ExampleModel.StructuredValue ) => findShape(e, e +: request.branchStack).map(s => - PureShapePropertiesSuggestions(s._2, request.actualDialect, request.alsConfigurationState) + PureShapePropertiesSuggestions(s._2, request.actualDocumentDefinition, request.alsConfigurationState) ) case _ => None } @@ -131,7 +130,7 @@ trait ExampleSuggestionPluginBuilder { .map(obj => new ObjectExamplePropertiesCompletionPlugin( obj, - request.actualDialect, + request.actualDocumentDefinition, anyShape, e, request.alsConfigurationState diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/WebApiTypeFacetsCompletionPlugin.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/WebApiTypeFacetsCompletionPlugin.scala index 68d002f666..2dd1163c2d 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/WebApiTypeFacetsCompletionPlugin.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/WebApiTypeFacetsCompletionPlugin.scala @@ -14,6 +14,7 @@ import org.mulesoft.als.suggestions.aml.AmlCompletionRequest import org.mulesoft.als.suggestions.interfaces.AMLCompletionPlugin import org.mulesoft.als.suggestions.plugins.aml.NodeMappingWrapper import org.mulesoft.amfintegration.AmfImplicits.AmfObjectImp +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition import scala.concurrent.Future @@ -26,14 +27,14 @@ trait WebApiTypeFacetsCompletionPlugin extends AMLCompletionPlugin with WritingS params.astPartBranch, shape, params.branchStack, - params.actualDialect + params.actualDocumentDefinition ) && params.fieldEntry.isEmpty => - resolveShape(shape, params.branchStack, params.actualDialect) + resolveShape(shape, params.branchStack, params.actualDocumentDefinition) case _ => Nil }) } - def resolveShape(shape: Shape, branchStack: Seq[AmfObject], dialect: Dialect, default: Option[NodeMapping] = getSuggestionsForAnyShapeNode): Seq[RawSuggestion] = { + def resolveShape(shape: Shape, branchStack: Seq[AmfObject], documentDefinition: DocumentDefinition, default: Option[NodeMapping] = getSuggestionsForAnyShapeNode): Seq[RawSuggestion] = { val node = shape match { case scalar: ScalarShape => scalar.dataType.option() match { @@ -52,19 +53,19 @@ trait WebApiTypeFacetsCompletionPlugin extends AMLCompletionPlugin with WritingS s } - resolveSuggestionForShape(node, shape, branchStack, dialect) + resolveSuggestionForShape(node, shape, branchStack, documentDefinition) } - private def resolveSuggestionForShape(node: Option[NodeMapping], shape: Shape, branchStack: Seq[AmfObject], dialect: Dialect) + private def resolveSuggestionForShape(node: Option[NodeMapping], shape: Shape, branchStack: Seq[AmfObject], documentDefinition: DocumentDefinition) : Seq[RawSuggestion] = { val classSuggestions: Seq[RawSuggestion] = - node.map(n => n.propertiesRaw(fromDialect = dialect)).getOrElse(Nil) + node.map(n => n.propertiesRaw(fromDefinition = documentDefinition)).getOrElse(Nil) // corner case, property shape should suggest facets of the range PLUS required val finalSuggestions: Iterable[RawSuggestion] = (branchStack.headOption match { case Some(_: PropertyShape) => (propertyShapeNode - .map(_.propertiesRaw(fromDialect = dialect)) + .map(_.propertiesRaw(fromDefinition = documentDefinition)) .getOrElse(Nil) ++ classSuggestions).toSet case _ => classSuggestions }) ++ defaults(shape) diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/WritingShapeInfo.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/WritingShapeInfo.scala index 1ab161c455..344c1a94e6 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/WritingShapeInfo.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/WritingShapeInfo.scala @@ -4,21 +4,22 @@ import amf.aml.client.scala.model.document.Dialect import amf.apicontract.client.scala.model.domain.Parameter import amf.core.client.scala.model.domain.{AmfObject, Shape} import org.mulesoft.als.common.ASTPartBranch +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition import org.mulesoft.amfintegration.dialect.DialectKnowledge trait WritingShapeInfo { protected def isWritingFacet( - astPartBranch: ASTPartBranch, - shape: Shape, - stack: Seq[AmfObject], - actualDialect: Dialect + astPartBranch: ASTPartBranch, + shape: Shape, + stack: Seq[AmfObject], + actualDocumentDefinition: DocumentDefinition ): Boolean = astPartBranch.isKeyLike && !astPartBranch.parentEntryIs("required") && !writingShapeName(shape, astPartBranch) && !writingParamName( stack, astPartBranch ) && !astPartBranch.parentEntryIs("properties") && - !DialectKnowledge.isInclusion(astPartBranch, actualDialect) + !DialectKnowledge.isInclusion(astPartBranch, actualDocumentDefinition) protected def writingShapeName(shape: Shape, astPartBranch: ASTPartBranch): Boolean = shape.name.value() == astPartBranch.stringValue diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/async/Async20EnumCompletionPlugin.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/async/Async20EnumCompletionPlugin.scala index f298ffe4c7..e248eeb471 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/async/Async20EnumCompletionPlugin.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/async/Async20EnumCompletionPlugin.scala @@ -11,6 +11,7 @@ import org.mulesoft.als.suggestions.aml.AmlCompletionRequest import org.mulesoft.als.suggestions.interfaces.AMLCompletionPlugin import org.mulesoft.als.suggestions.plugins.aml.{AMLEnumCompletionPlugin, EnumSuggestions} import org.mulesoft.als.suggestions.util.DialectFinderByMediaType +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition import org.mulesoft.amfintegration.dialect.dialects.asyncapi20.MessageObjectNode import org.mulesoft.amfintegration.dialect.dialects.asyncapi26.Message26ObjectNode @@ -42,17 +43,17 @@ trait AsyncEnumCompletionPlugin extends AMLCompletionPlugin with EnumSuggestions private def isInsideAvro(params: AmlCompletionRequest) = { // skip cases in the root because they are not handled in the other specific plugins (we should delegate it in the future) params.branchStack.tail.collectFirst { case p: Payload => p }.exists { p => - findDialectFromPayload(p).name().option().contains("avro") + findDialectFromPayload(p).name().contains("avro") } } private def cloneParamsForSchemaMediaType(params: AmlCompletionRequest) = params.branchStack .collectFirst { - case p: Payload => params.withDialect(getDialectBySchemaMediaType(p)) + case p: Payload => params.withDefinition(getDialectBySchemaMediaType(p)) }.getOrElse(params) - private def getDialectBySchemaMediaType(payload: Payload): Dialect = + private def getDialectBySchemaMediaType(payload: Payload): DocumentDefinition = findDialectFromPayload(payload) } case object Async20EnumCompletionPlugin extends AsyncEnumCompletionPlugin { diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/async/Async20PayloadCompletionPlugin.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/async/Async20PayloadCompletionPlugin.scala index 2fe823caf1..f963afb86a 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/async/Async20PayloadCompletionPlugin.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/async/Async20PayloadCompletionPlugin.scala @@ -8,6 +8,7 @@ import org.mulesoft.als.suggestions.aml.AmlCompletionRequest import org.mulesoft.als.suggestions.interfaces.AMLCompletionPlugin import org.mulesoft.als.suggestions.plugins.aml.webapi.WebApiTypeFacetsCompletionPlugin import org.mulesoft.als.suggestions.plugins.aml.webapi.avroschema.FieldTypeKnowledge +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition import org.mulesoft.amfintegration.dialect.dialects.asyncapi20.AsyncApi20Dialect import scala.concurrent.ExecutionContext.Implicits.global @@ -32,16 +33,16 @@ object Async20PayloadCompletionPlugin request.amfObject match { case s: Shape => if (p.schemaMediaType.isNullOrEmpty) - Future(Async20TypeFacetsCompletionPlugin.resolveShape(s, branchStack, AsyncApi20Dialect())) + Future(Async20TypeFacetsCompletionPlugin.resolveShape(s, branchStack, DocumentDefinition(AsyncApi20Dialect()))) else findPluginForMediaType(p) .map { case wf: WebApiTypeFacetsCompletionPlugin => - Future(wf.resolveShape(s, branchStack, AsyncApi20Dialect())) + Future(wf.resolveShape(s, branchStack, DocumentDefinition(AsyncApi20Dialect()))) case generic => generic.resolve(request) } - .getOrElse(Future(Async20TypeFacetsCompletionPlugin.resolveShape(s, branchStack, AsyncApi20Dialect()))) + .getOrElse(Future(Async20TypeFacetsCompletionPlugin.resolveShape(s, branchStack, DocumentDefinition(AsyncApi20Dialect())))) } case _ => emptySuggestion } diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/async/Async2MessageExamplesCompletionPlugin.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/async/Async2MessageExamplesCompletionPlugin.scala index ed5821caaa..ac8e27d8d4 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/async/Async2MessageExamplesCompletionPlugin.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/async/Async2MessageExamplesCompletionPlugin.scala @@ -23,7 +23,7 @@ object Async2MessageExamplesCompletionPlugin extends AMLCompletionPlugin with As override def resolve(params: AmlCompletionRequest): Future[Seq[RawSuggestion]] = { if (isExampleAtPayload(params)) Future.successful( - examplesNode(params.nodeDialect.nameAndVersion()).Obj.propertiesRaw(fromDialect = params.actualDialect) + examplesNode(params.nodeDocumentDefinition.nameAndVersion()).Obj.propertiesRaw(fromDefinition = params.actualDocumentDefinition) ) else emptySuggestion } diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/async/AsyncMediaTypePluginFinder.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/async/AsyncMediaTypePluginFinder.scala index a243e70886..a0aa798d12 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/async/AsyncMediaTypePluginFinder.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/async/AsyncMediaTypePluginFinder.scala @@ -3,7 +3,7 @@ package org.mulesoft.als.suggestions.plugins.aml.webapi.async import amf.apicontract.client.scala.model.domain.Payload import org.mulesoft.als.suggestions.interfaces.AMLCompletionPlugin import org.mulesoft.als.suggestions.plugins.aml.webapi.avroschema.AvroTypeFacetsCompletionPlugin -import org.mulesoft.als.suggestions.plugins.aml.webapi.jsonSchema.JsonSchemeDraft7TypeFacetsCompletionPlugin +import org.mulesoft.als.suggestions.plugins.aml.webapi.jsonschema.JsonSchemeDraft7TypeFacetsCompletionPlugin import org.mulesoft.als.suggestions.plugins.aml.webapi.oas.oas30.Oas30TypeFacetsCompletionPlugin import org.mulesoft.als.suggestions.plugins.aml.webapi.raml.raml10.Raml10TypeFacetsCompletionPlugin diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/async/structure/Async2HeadersSchema.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/async/structure/Async2HeadersSchema.scala index 67db237990..adf89b48e4 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/async/structure/Async2HeadersSchema.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/async/structure/Async2HeadersSchema.scala @@ -17,7 +17,7 @@ object Async2HeadersSchema extends ResolveIfApplies { .isInstanceOf[Parameter] && request.astPartBranch.isKeyDescendantOf("headers") && request.branchStack.headOption .exists(_.isInstanceOf[Response]) ) - Some(Future(AnyShapeAsync2Node.Obj.propertiesRaw(fromDialect = request.actualDialect))) + Some(Future(AnyShapeAsync2Node.Obj.propertiesRaw(fromDefinition = request.actualDocumentDefinition))) else notApply } } diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/avroschema/AvroTypeFacetsCompletionPlugin.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/avroschema/AvroTypeFacetsCompletionPlugin.scala index de3b4fc44b..d7bacd81dc 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/avroschema/AvroTypeFacetsCompletionPlugin.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/avroschema/AvroTypeFacetsCompletionPlugin.scala @@ -4,6 +4,7 @@ import org.mulesoft.als.suggestions.aml.AmlCompletionRequest import org.mulesoft.als.suggestions.aml.avroschema.AvroCompletionPluginRegistry import org.mulesoft.als.suggestions.interfaces.AMLCompletionPlugin import org.mulesoft.als.suggestions.{CompletionPluginsRegistryAML, RawSuggestion} +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition import org.mulesoft.amfintegration.dialect.dialects.avro.AvroDialect import scala.concurrent.Future @@ -13,7 +14,7 @@ object AvroTypeFacetsCompletionPlugin extends AMLCompletionPlugin { override def id: String = "AvroTypeFacetsCompletionPlugin" override def resolve(request: AmlCompletionRequest): Future[Seq[RawSuggestion]] = { - val newRequest: AmlCompletionRequest = request.withDialect(AvroDialect.dialect) + val newRequest: AmlCompletionRequest = request.withDefinition(DocumentDefinition(AvroDialect.dialect)) val pluginsRegistry = new CompletionPluginsRegistryAML AvroCompletionPluginRegistry.plugins.foreach(pluginsRegistry.registerPlugin) diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/avroschema/structure/ResolveBySchemaType.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/avroschema/structure/ResolveBySchemaType.scala index c227713916..0373cdd172 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/avroschema/structure/ResolveBySchemaType.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/avroschema/structure/ResolveBySchemaType.scala @@ -1,6 +1,5 @@ package org.mulesoft.als.suggestions.plugins.aml.webapi.avroschema.structure -import amf.aml.client.scala.model.document.Dialect import amf.core.client.scala.model.domain.AmfObject import amf.shapes.client.scala.model.domain.ScalarShape import amf.shapes.internal.annotations.AVROSchemaType @@ -10,6 +9,7 @@ import org.mulesoft.als.suggestions.aml.AmlCompletionRequest import org.mulesoft.als.suggestions.interfaces.ResolveIfApplies import org.mulesoft.als.suggestions.plugins.aml._ import org.mulesoft.amfintegration.AmfImplicits.AmfAnnotationsImp +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition import org.mulesoft.amfintegration.dialect.dialects.avro.{AvroEnumNode, AvroFixedNode, AvroMapNode} import org.mulesoft.amfintegration.dialect.dialects.oas.nodes.DialectNode import org.mulesoft.common.client.lexical.ASTElement @@ -26,7 +26,7 @@ trait ResolveBySchemaType[T <: AmfObject] extends ResolveIfApplies { override def resolve(request: AmlCompletionRequest): Option[Future[Seq[RawSuggestion]]] = { request.amfObject match { case obj: T if isSchemaType(obj) && isSameLevel(obj.annotations.astElement(), request.astPartBranch) => - applies(mapNodeSuggestions(request.actualDialect)) + applies(mapNodeSuggestions(request.actualDocumentDefinition)) case _ => notApply } @@ -48,7 +48,7 @@ trait ResolveBySchemaType[T <: AmfObject] extends ResolveIfApplies { case _ => false } - private def mapNodeSuggestions(d: Dialect): Future[Seq[RawSuggestion]] = + private def mapNodeSuggestions(d: DocumentDefinition): Future[Seq[RawSuggestion]] = Future(node.Obj.propertiesRaw(Some("schemas"), d)) } diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/avroschema/structure/ResolveField.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/avroschema/structure/ResolveField.scala index 309416cad4..14e79b8bb3 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/avroschema/structure/ResolveField.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/avroschema/structure/ResolveField.scala @@ -1,12 +1,12 @@ package org.mulesoft.als.suggestions.plugins.aml.webapi.avroschema.structure -import amf.aml.client.scala.model.document.Dialect import amf.shapes.client.scala.model.domain.AnyShape import org.mulesoft.als.suggestions.RawSuggestion import org.mulesoft.als.suggestions.aml.AmlCompletionRequest import org.mulesoft.als.suggestions.interfaces.ResolveIfApplies import org.mulesoft.als.suggestions.plugins.aml._ import org.mulesoft.amfintegration.AmfImplicits.AmfAnnotationsImp +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition import org.mulesoft.amfintegration.dialect.dialects.avro.AvroFieldNode import scala.concurrent.ExecutionContext.Implicits.global @@ -16,7 +16,7 @@ object ResolveField extends ResolveIfApplies { override def resolve(request: AmlCompletionRequest): Option[Future[Seq[RawSuggestion]]] = { request.amfObject match { case _: AnyShape if isField(request) && !newerTypeDefined(request) => - applies(fieldNodeSuggestions(request.actualDialect)) + applies(fieldNodeSuggestions(request.actualDocumentDefinition)) case _ => notApply } @@ -31,6 +31,6 @@ object ResolveField extends ResolveIfApplies { .map(_.avroType) .contains("record") - private def fieldNodeSuggestions(d: Dialect): Future[Seq[RawSuggestion]] = + private def fieldNodeSuggestions(d: DocumentDefinition): Future[Seq[RawSuggestion]] = Future(AvroFieldNode.Obj.propertiesRaw(Some("parameters"), d)) } diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/jsonSchema/JsonSchemaRefTag.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/jsonschema/JsonSchemaRefTag.scala similarity index 85% rename from als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/jsonSchema/JsonSchemaRefTag.scala rename to als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/jsonschema/JsonSchemaRefTag.scala index 48c506d75c..1ba4a1e034 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/jsonSchema/JsonSchemaRefTag.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/jsonschema/JsonSchemaRefTag.scala @@ -1,4 +1,4 @@ -package org.mulesoft.als.suggestions.plugins.aml.webapi.jsonSchema +package org.mulesoft.als.suggestions.plugins.aml.webapi.jsonschema import org.mulesoft.als.common.YPartBranch import org.mulesoft.als.suggestions.plugins.aml.AMLRefTagCompletionPlugin diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/jsonSchema/JsonSchemaRequiredObjectCompletionPlugin.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/jsonschema/JsonSchemaRequiredObjectCompletionPlugin.scala similarity index 92% rename from als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/jsonSchema/JsonSchemaRequiredObjectCompletionPlugin.scala rename to als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/jsonschema/JsonSchemaRequiredObjectCompletionPlugin.scala index 02821e3d94..623e7adadc 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/jsonSchema/JsonSchemaRequiredObjectCompletionPlugin.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/jsonschema/JsonSchemaRequiredObjectCompletionPlugin.scala @@ -1,4 +1,4 @@ -package org.mulesoft.als.suggestions.plugins.aml.webapi.jsonSchema +package org.mulesoft.als.suggestions.plugins.aml.webapi.jsonschema import org.mulesoft.als.suggestions.RawSuggestion import org.mulesoft.als.suggestions.aml.AmlCompletionRequest diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/jsonSchema/JsonSchemeDraft7TypeFacetsCompletionPlugin.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/jsonschema/JsonSchemeDraft7TypeFacetsCompletionPlugin.scala similarity index 95% rename from als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/jsonSchema/JsonSchemeDraft7TypeFacetsCompletionPlugin.scala rename to als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/jsonschema/JsonSchemeDraft7TypeFacetsCompletionPlugin.scala index 99e301af72..62c369effe 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/jsonSchema/JsonSchemeDraft7TypeFacetsCompletionPlugin.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/jsonschema/JsonSchemeDraft7TypeFacetsCompletionPlugin.scala @@ -1,4 +1,4 @@ -package org.mulesoft.als.suggestions.plugins.aml.webapi.jsonSchema +package org.mulesoft.als.suggestions.plugins.aml.webapi.jsonschema import amf.aml.client.scala.model.document.Dialect import amf.aml.client.scala.model.domain.NodeMapping diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/ExampleMediaType.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/ExampleMediaType.scala index 84f846b757..bbb2941855 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/ExampleMediaType.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/ExampleMediaType.scala @@ -21,7 +21,7 @@ object ExampleMediaType extends AMLCompletionPlugin { new AMLKnownValueCompletions( ExampleModel.MediaType, ExampleModel.`type`.head.iri(), - request.actualDialect, + request.actualDocumentDefinition, request.astPartBranch.isKey, request.astPartBranch.isInArray || request.astPartBranch.isArray, true diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/OaslikeSecurityScopesCompletionPlugin.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/OaslikeSecurityScopesCompletionPlugin.scala index db573b1c0f..37874aaf23 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/OaslikeSecurityScopesCompletionPlugin.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/OaslikeSecurityScopesCompletionPlugin.scala @@ -28,7 +28,7 @@ object OaslikeSecurityScopesCompletionPlugin extends AMLCompletionPlugin { category = CategoryRegistry( OAuth2FlowModel.`type`.head.iri(), OAuth2FlowModel.Scopes.value.iri(), - request.actualDialect.id + request.actualDocumentDefinition.baseUnit.id ), mandatory = false ) diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/ParameterReferenceCompletionPlugin.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/ParameterReferenceCompletionPlugin.scala index 4ef3c85e13..8da25c5046 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/ParameterReferenceCompletionPlugin.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/ParameterReferenceCompletionPlugin.scala @@ -21,7 +21,7 @@ object ParameterReferenceCompletionPlugin extends AMLCompletionPlugin { request.amfObject match { case _: Parameter => new AMLJsonSchemaStyleDeclarationReferences( - request.actualDialect, + request.actualDocumentDefinition, paramIriMaps.keys.toSeq, request.amfObject.elementIdentifier(), request.astPartBranch, diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/ResponsesDeclarationCodes.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/ResponsesDeclarationCodes.scala index 106a325977..633fb41903 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/ResponsesDeclarationCodes.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/ResponsesDeclarationCodes.scala @@ -17,7 +17,7 @@ object ResponsesDeclarationCodes extends AMLCompletionPlugin { new AMLKnownValueCompletions( ResponseModel.StatusCode, ResponseModel.`type`.head.iri(), - request.actualDialect, + request.actualDocumentDefinition, request.astPartBranch.isKey, request.astPartBranch.isInArray || request.astPartBranch.isArray, true diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/VariableValueParam.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/VariableValueParam.scala index 41025eff87..29591d7102 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/VariableValueParam.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/VariableValueParam.scala @@ -24,7 +24,7 @@ trait VariableValueParam extends ExceptionPlugin { protected val variableDialectNode: DialectNode override def resolve(request: AmlCompletionRequest): Future[Seq[RawSuggestion]] = if (applies(request)) Future { - variableDialectNode.Obj.propertiesRaw(fromDialect = request.actualDialect).filter(_.displayText != "name") + variableDialectNode.Obj.propertiesRaw(fromDefinition = request.actualDocumentDefinition).filter(_.displayText != "name") } else emptySuggestion diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/oas20/Oas20ParameterStructure.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/oas20/Oas20ParameterStructure.scala index 5883dadfe0..cdc0f83aa5 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/oas20/Oas20ParameterStructure.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/oas20/Oas20ParameterStructure.scala @@ -12,6 +12,7 @@ import org.mulesoft.als.suggestions.aml.AmlCompletionRequest import org.mulesoft.als.suggestions.interfaces.AMLCompletionPlugin import org.mulesoft.als.suggestions.plugins.aml._ import org.mulesoft.als.suggestions.plugins.aml.categories.CategoryRegistry +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition import org.mulesoft.amfintegration.dialect.dialects.oas.OAS20Dialect import org.mulesoft.amfintegration.dialect.dialects.oas.nodes.Oas20ParamObject import org.mulesoft.amfintegration.dialect.dialects.oas.nodes.Oas20ParamObject.allowEmptyValue @@ -53,7 +54,7 @@ object Oas20ParameterStructure extends AMLCompletionPlugin { def bodySuggestions(astPartBranch: ASTPartBranch, p: Parameter): Seq[RawSuggestion] = if (p.name.value() != astPartBranch.stringValue) - Oas20TypeFacetsCompletionPlugin.resolveShape(Option(p.schema).getOrElse(AnyShape()), Nil, OAS20Dialect()) + Oas20TypeFacetsCompletionPlugin.resolveShape(Option(p.schema).getOrElse(AnyShape()), Nil, DocumentDefinition(OAS20Dialect())) else Nil def suggestions(amfObject: AmfObject): Seq[RawSuggestion] = diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/oas20/structure/ResolveRequest.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/oas20/structure/ResolveRequest.scala index ab6331e543..ccfd77d0b8 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/oas20/structure/ResolveRequest.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/oas20/structure/ResolveRequest.scala @@ -20,10 +20,10 @@ object ResolveRequest extends ResolveIfApplies with ParameterKnowledge { applies(Future.successful(Seq())) else if (request.fieldEntry.isEmpty && !definingParam(request.astPartBranch)) applies(Future { - request.actualDialect.declares + request.actualDocumentDefinition.declares .collect({ case n: NodeMapping => n }) .find(_.nodetypeMapping.option().contains(OperationModel.`type`.head.iri())) - .map(_.propertiesRaw(fromDialect = request.actualDialect)) + .map(_.propertiesRaw(fromDefinition = request.actualDocumentDefinition)) .getOrElse(Nil) }) else notApply diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/oas30/DiscriminatorObject.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/oas30/DiscriminatorObject.scala index 52bc65f9b1..139050c960 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/oas30/DiscriminatorObject.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/oas30/DiscriminatorObject.scala @@ -1,12 +1,12 @@ package org.mulesoft.als.suggestions.plugins.aml.webapi.oas.oas30 -import amf.aml.client.scala.model.document.Dialect import amf.shapes.client.scala.model.domain.NodeShape import amf.shapes.internal.domain.metamodel.NodeShapeModel import org.mulesoft.als.suggestions.RawSuggestion import org.mulesoft.als.suggestions.aml.AmlCompletionRequest import org.mulesoft.als.suggestions.plugins.aml._ import org.mulesoft.als.suggestions.plugins.aml.webapi.ExceptionPlugin +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition import org.mulesoft.amfintegration.dialect.dialects.oas.nodes.AMLDiscriminatorObject import scala.concurrent.ExecutionContext.Implicits.global @@ -16,11 +16,11 @@ object DiscriminatorObject extends ExceptionPlugin { override def id: String = "DiscriminatorObject" override def resolve(request: AmlCompletionRequest): Future[Seq[RawSuggestion]] = { - if (applies(request)) Future { suggestBody(request.actualDialect) } + if (applies(request)) Future { suggestBody(request.actualDocumentDefinition) } else emptySuggestion } - private def suggestBody(d: Dialect) = AMLDiscriminatorObject.Obj.propertiesRaw(fromDialect = d) + private def suggestBody(d: DocumentDefinition) = AMLDiscriminatorObject.Obj.propertiesRaw(fromDefinition = d) override def applies(request: AmlCompletionRequest): Boolean = request.amfObject.isInstanceOf[NodeShape] && isInDiscriminator(request) diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/oas30/Oas30ParameterStructure.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/oas30/Oas30ParameterStructure.scala index cd5c67e9b2..6adb95cc8f 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/oas30/Oas30ParameterStructure.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/oas30/Oas30ParameterStructure.scala @@ -10,6 +10,7 @@ import org.mulesoft.als.suggestions.RawSuggestion import org.mulesoft.als.suggestions.aml.AmlCompletionRequest import org.mulesoft.als.suggestions.interfaces.AMLCompletionPlugin import org.mulesoft.als.suggestions.plugins.aml._ +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition import org.mulesoft.amfintegration.dialect.dialects.oas.OAS30Dialect import org.mulesoft.amfintegration.dialect.dialects.oas.nodes.{Oas30AMLHeaderObject, Oas30ParamObject} @@ -42,9 +43,9 @@ object Oas30ParameterStructure extends AMLCompletionPlugin { }) } - private lazy val paramProps = Oas30ParamObject.Obj.propertiesRaw(fromDialect = OAS30Dialect()) + private lazy val paramProps = Oas30ParamObject.Obj.propertiesRaw(fromDefinition = DocumentDefinition(OAS30Dialect())) - private lazy val headerProps = Oas30AMLHeaderObject.Obj.propertiesRaw(fromDialect = OAS30Dialect()) + private lazy val headerProps = Oas30AMLHeaderObject.Obj.propertiesRaw(fromDefinition = DocumentDefinition(OAS30Dialect())) private def isWritingFacet(p: Parameter, astPartBranch: ASTPartBranch) = (p.name.option().isEmpty || p.name diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/oas30/RefToParameters.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/oas30/RefToParameters.scala index 6ac415212a..62684c08c9 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/oas30/RefToParameters.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/oas30/RefToParameters.scala @@ -1,6 +1,5 @@ package org.mulesoft.als.suggestions.plugins.aml.webapi.oas.oas30 -import amf.aml.client.scala.model.document.Dialect import amf.apicontract.client.scala.model.domain.Parameter import amf.apicontract.internal.metamodel.domain.ParameterModel import amf.core.client.scala.model.domain.{DomainElement, NamedDomainElement} @@ -9,6 +8,7 @@ import org.mulesoft.als.suggestions.RawSuggestion import org.mulesoft.als.suggestions.aml.AmlCompletionRequest import org.mulesoft.als.suggestions.interfaces.AMLCompletionPlugin import org.mulesoft.als.suggestions.plugins.aml.AMLJsonSchemaStyleDeclarationReferences +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.Future @@ -46,15 +46,15 @@ object RefToParameters extends AMLCompletionPlugin { path: String, fn: DomainElement => Boolean ): Seq[RawSuggestion] = { - val dcl = declarationPath(request.actualDialect) + val dcl = declarationPath(request.actualDocumentDefinition) val strings = declarations(request, fn).map(d => s"#/$dcl$path/$d") AMLJsonSchemaStyleDeclarationReferences .resolveRoutes(strings, request.astPartBranch) } - private def declarationPath(dialect: Dialect) = { - dialect.documents().declarationsPath().option().map(_ + "/").getOrElse("") + private def declarationPath(dialect: DocumentDefinition) = { + dialect.documents().flatMap(_.declarationsPath().option()).map(_ + "/").getOrElse("") } private def declarations(request: AmlCompletionRequest, filterFn: DomainElement => Boolean): Seq[String] = { diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/oas30/structure/ResolveRequestBody.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/oas30/structure/ResolveRequestBody.scala index 60f059b2e1..7454427d63 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/oas30/structure/ResolveRequestBody.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/oas30/structure/ResolveRequestBody.scala @@ -1,12 +1,12 @@ package org.mulesoft.als.suggestions.plugins.aml.webapi.oas.oas30.structure -import amf.aml.client.scala.model.document.Dialect import amf.apicontract.client.scala.model.domain.api.WebApi import org.mulesoft.als.suggestions.RawSuggestion import org.mulesoft.als.suggestions.aml.AmlCompletionRequest import org.mulesoft.als.suggestions.interfaces.ResolveIfApplies import org.mulesoft.als.suggestions.plugins.aml.NodeMappingWrapper import org.mulesoft.als.suggestions.plugins.aml.webapi.oas.OASRefTag.refSuggestion +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition import org.mulesoft.amfintegration.dialect.dialects.oas.nodes.AMLRequestBodyObject import org.yaml.model.YMapEntry @@ -21,13 +21,13 @@ object ResolveRequestBody extends ResolveIfApplies { val idxParent = if (request.astPartBranch.strict) 6 else 3 request.astPartBranch.getAncestor(idxParent) match { case Some(yme: YMapEntry) if yme.key.asScalar.map(_.text).contains("requestBodies") => - Some(requestBodySuggestions(request.actualDialect)) + Some(requestBodySuggestions(request.actualDocumentDefinition)) case _ => notApply } case _ => notApply } } - private def requestBodySuggestions(d: Dialect): Future[Seq[RawSuggestion]] = + private def requestBodySuggestions(d: DocumentDefinition): Future[Seq[RawSuggestion]] = Future { AMLRequestBodyObject.Obj.propertiesRaw(None, d) ++ refSuggestion } diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/structure/ResolveDeclaredResponse.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/structure/ResolveDeclaredResponse.scala index 258bb5ecd0..d80875558c 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/structure/ResolveDeclaredResponse.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/structure/ResolveDeclaredResponse.scala @@ -23,7 +23,7 @@ object ResolveDeclaredResponse extends ResolveIfApplies { private def declaredResponse(request: AmlCompletionRequest): Future[Seq[RawSuggestion]] = Future { new AMLStructureCompletionsPlugin( request.propertyMapping.filter(_.id != Oas20ResponseObject.statusCodeProperty.id), - request.actualDialect + request.actualDocumentDefinition ) .resolve(request.amfObject.metaURIs.head) } diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/structure/ResolveInfo.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/structure/ResolveInfo.scala index daf1dce8ad..ba1142e195 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/structure/ResolveInfo.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/structure/ResolveInfo.scala @@ -1,12 +1,12 @@ package org.mulesoft.als.suggestions.plugins.aml.webapi.oas.structure -import amf.aml.client.scala.model.document.Dialect import amf.apicontract.client.scala.model.document.ComponentModule import amf.apicontract.client.scala.model.domain.api.{AsyncApi, WebApi} import org.mulesoft.als.suggestions.RawSuggestion import org.mulesoft.als.suggestions.aml.AmlCompletionRequest import org.mulesoft.als.suggestions.interfaces.ResolveIfApplies import org.mulesoft.als.suggestions.plugins.aml._ +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition import org.mulesoft.amfintegration.dialect.dialects.asyncapi20.{AMLInfoObject => AsyncInfoObject} import org.mulesoft.amfintegration.dialect.dialects.oas.nodes.{AMLInfoObject => WebAPIInfoObject} @@ -17,19 +17,19 @@ object ResolveInfo extends ResolveIfApplies { override def resolve(request: AmlCompletionRequest): Option[Future[Seq[RawSuggestion]]] = { request.amfObject match { case _: ComponentModule if request.astPartBranch.isKeyDescendantOf("info") => - applies(componentInfoSuggestions(request.actualDialect)) + applies(componentInfoSuggestions(request.actualDocumentDefinition)) case _: WebApi if request.astPartBranch.isKeyDescendantOf("info") => - applies(webApiInfoSuggestions(request.actualDialect)) + applies(webApiInfoSuggestions(request.actualDocumentDefinition)) case _: AsyncApi if request.astPartBranch.isKeyDescendantOf("info") => - applies(asyncInfoSuggestions(request.actualDialect)) + applies(asyncInfoSuggestions(request.actualDocumentDefinition)) case _ => notApply } } - private def webApiInfoSuggestions(d: Dialect): Future[Seq[RawSuggestion]] = + private def webApiInfoSuggestions(d: DocumentDefinition): Future[Seq[RawSuggestion]] = Future(WebAPIInfoObject.Obj.propertiesRaw(Some("docs"), d)) - private def componentInfoSuggestions(d: Dialect): Future[Seq[RawSuggestion]] = + private def componentInfoSuggestions(d: DocumentDefinition): Future[Seq[RawSuggestion]] = Future( WebAPIInfoObject.Obj .propertiesMapping() @@ -38,6 +38,6 @@ object ResolveInfo extends ResolveIfApplies { .map(_.toRaw("docs")) ) - private def asyncInfoSuggestions(d: Dialect): Future[Seq[RawSuggestion]] = + private def asyncInfoSuggestions(d: DocumentDefinition): Future[Seq[RawSuggestion]] = Future(AsyncInfoObject.Obj.propertiesRaw(Some("docs"), d)) } diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/structure/ResolveParameterInRequest.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/structure/ResolveParameterInRequest.scala index aed98d4771..4b6648172f 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/structure/ResolveParameterInRequest.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/oas/structure/ResolveParameterInRequest.scala @@ -16,12 +16,12 @@ object ResolveParameterInRequest extends ResolveIfApplies { request.amfObject match { case o: Operation if o.graph.containsProperty(OperationModel.Request.value.iri()) => val branch = - o.request.findSon(o.location().getOrElse(""), request.actualDialect, request.astPartBranch) + o.request.findSon(o.location().getOrElse(""), request.actualDocumentDefinition, request.astPartBranch) if (branch.obj.isInstanceOf[Parameter] && branch.fe.isEmpty) applies( Future.successful( Oas30ParamObject.Obj - .propertiesRaw(fromDialect = request.actualDialect) ++ AMLRefTagCompletionPlugin.refSuggestion + .propertiesRaw(fromDefinition = request.actualDocumentDefinition) ++ AMLRefTagCompletionPlugin.refSuggestion ) ) else notApply diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/AMLLibraryPathCompletion.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/AMLLibraryPathCompletion.scala index 9af31ea90a..9971623ed2 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/AMLLibraryPathCompletion.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/AMLLibraryPathCompletion.scala @@ -17,7 +17,7 @@ object AMLLibraryPathCompletion extends AMLCompletionPlugin { if ( (request.amfObject .isInstanceOf[BaseUnit] || - isEncodes(request.amfObject, request.actualDialect, request.branchStack)) && matchesAST(request) + isEncodes(request.amfObject, request.actualDocumentDefinition, request.branchStack)) && matchesAST(request) ) { AMLPathCompletionPlugin.resolveInclusion( request.baseUnit.location().getOrElse(""), diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/AnnotationFacets.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/AnnotationFacets.scala index 240dab4cb3..8eaf592207 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/AnnotationFacets.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/AnnotationFacets.scala @@ -28,7 +28,7 @@ object AnnotationFacets extends AMLCompletionPlugin { case s: Shape if request.branchStack.headOption .exists(_.isInstanceOf[CustomDomainProperty]) && isWrittingFacet(request) => - Raml10TypesDialect.AnnotationType.propertiesRaw(fromDialect = request.actualDialect) + Raml10TypesDialect.AnnotationType.propertiesRaw(fromDefinition = request.actualDocumentDefinition) case _ => Nil } } @@ -42,12 +42,12 @@ object AnnotationFacets extends AMLCompletionPlugin { private def typeFacets(request: AmlCompletionRequest) = { val plugin = - if (request.actualDialect.id == Raml08TypesDialect.DialectLocation) Raml08TypeFacetsCompletionPlugin + if (request.actualDocumentDefinition.baseUnit.id == Raml08TypesDialect.DialectLocation) Raml08TypeFacetsCompletionPlugin else Raml10TypeFacetsCompletionPlugin plugin.resolveShape( ScalarShape().set(ScalarShapeModel.DataType, AmfScalar("string"), Annotations() += Inferred()), Nil, - request.actualDialect + request.actualDocumentDefinition ) } } diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/ExampleStructure.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/ExampleStructure.scala index 1db7b8db71..bee6f5c8b0 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/ExampleStructure.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/ExampleStructure.scala @@ -21,7 +21,7 @@ object ExampleStructure extends AMLCompletionPlugin { if request.fieldEntry.exists(_.field == ExampleModel.Name) && request.astPartBranch.stringValue != e.name .option() .getOrElse("") && request.astPartBranch.isKey => - Raml10DialectNodes.ExampleNode.propertiesRaw(fromDialect = request.actualDialect) + Raml10DialectNodes.ExampleNode.propertiesRaw(fromDefinition = request.actualDocumentDefinition) case _ => Nil } } diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/NodeShapeDiscriminatorProperty.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/NodeShapeDiscriminatorProperty.scala index e2ef68d9ff..26e145e573 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/NodeShapeDiscriminatorProperty.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/NodeShapeDiscriminatorProperty.scala @@ -21,7 +21,7 @@ object NodeShapeDiscriminatorProperty extends AMLCompletionPlugin { Future { request.amfObject match { case node: NodeShape if request.fieldEntry.exists(t => t.field == NodeShapeModel.Discriminator) => - nodeProperties(node, request.alsConfigurationState.configForDialect(request.actualDialect)) + nodeProperties(node, request.alsConfigurationState.configForDefinition(request.actualDocumentDefinition)) .map(RawSuggestion.apply(_, isAKey = false)) case _ => Nil } diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/OperationRequest.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/OperationRequest.scala index 31160452ae..6aec41d813 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/OperationRequest.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/OperationRequest.scala @@ -20,7 +20,7 @@ object OperationRequest extends AMLCompletionPlugin { request.amfObject match { case _: Request if request.branchStack.headOption.exists(_.isInstanceOf[Operation]) && request.fieldEntry.isEmpty => - val nodeMapping: Option[NodeMapping] = request.actualDialect.declares + val nodeMapping: Option[NodeMapping] = request.actualDocumentDefinition.declares .collect({ case d: NodeMapping => d }) .find(n => n.nodetypeMapping.option().exists(uri => OperationModel.`type`.headOption.map(_.iri()).contains(uri)) @@ -30,7 +30,7 @@ object OperationRequest extends AMLCompletionPlugin { n.propertiesMapping() .map(p => p.toRaw( - CategoryRegistry(OperationModel.`type`.head.iri(), p.name().value(), request.actualDialect.id) + CategoryRegistry(OperationModel.`type`.head.iri(), p.name().value(), request.actualDocumentDefinition.baseUnit.id) ) ) ) diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/RamlParamsCompletionPlugin.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/RamlParamsCompletionPlugin.scala index a8534a6a53..525052e87a 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/RamlParamsCompletionPlugin.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/RamlParamsCompletionPlugin.scala @@ -8,6 +8,7 @@ import org.mulesoft.als.suggestions.RawSuggestion import org.mulesoft.als.suggestions.aml.AmlCompletionRequest import org.mulesoft.als.suggestions.interfaces.AMLCompletionPlugin import org.mulesoft.als.suggestions.plugins.aml.webapi.WebApiTypeFacetsCompletionPlugin +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition import org.mulesoft.amfintegration.dialect.dialects.raml.raml10.Raml10TypesDialect import scala.concurrent.Future @@ -38,7 +39,7 @@ abstract class RamlParamsCompletionPlugin( branchStack: Seq[AmfObject], typeFacetsCompletionPlugin: WebApiTypeFacetsCompletionPlugin ): Seq[RawSuggestion] = { - typeFacetsCompletionPlugin.resolveShape(param.schema, branchStack, Raml10TypesDialect(), Some(typeFacetsCompletionPlugin.stringShapeNode)) ++ withOthers + typeFacetsCompletionPlugin.resolveShape(param.schema, branchStack, DocumentDefinition(Raml10TypesDialect()), Some(typeFacetsCompletionPlugin.stringShapeNode)) ++ withOthers } private def isNotName(params: AmlCompletionRequest): Boolean = { diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/RamlPayloadMediaTypeCompletionPlugin.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/RamlPayloadMediaTypeCompletionPlugin.scala index 7b6e23a55e..269a6fb891 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/RamlPayloadMediaTypeCompletionPlugin.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/RamlPayloadMediaTypeCompletionPlugin.scala @@ -17,7 +17,7 @@ object RamlPayloadMediaTypeCompletionPlugin extends AMLCompletionPlugin with Pay Future { if (isWritingKeyMediaType(request)) { PatchedSuggestionsForDialect - .getKnownValues(request.actualDialect.id, PayloadModel.`type`.head.iri(), PayloadModel.MediaType.value.iri()) + .getKnownValues(request.actualDocumentDefinition.baseUnit.id, PayloadModel.`type`.head.iri(), PayloadModel.MediaType.value.iri()) .map(p => RawSuggestion .forObject( @@ -25,7 +25,7 @@ object RamlPayloadMediaTypeCompletionPlugin extends AMLCompletionPlugin with Pay CategoryRegistry( PayloadModel.`type`.head.iri(), PayloadModel.MediaType.value.name, - request.actualDialect.id + request.actualDocumentDefinition.baseUnit.id ) ) ) diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/SecurityScopesCompletionPlugin.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/SecurityScopesCompletionPlugin.scala index f496f6a54e..01a7cf9042 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/SecurityScopesCompletionPlugin.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/SecurityScopesCompletionPlugin.scala @@ -35,7 +35,7 @@ object SecurityScopesCompletionPlugin extends AMLCompletionPlugin { category = CategoryRegistry( OAuth2FlowModel.`type`.head.iri(), OAuth2FlowModel.Scopes.value.iri(), - request.actualDialect.id + request.actualDocumentDefinition.baseUnit.id ), mandatory = false ) diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/SecuritySettingsFacetsCompletionPlugin.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/SecuritySettingsFacetsCompletionPlugin.scala index 1507ea160e..b45ffce3cb 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/SecuritySettingsFacetsCompletionPlugin.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/SecuritySettingsFacetsCompletionPlugin.scala @@ -1,6 +1,5 @@ package org.mulesoft.als.suggestions.plugins.aml.webapi.raml -import amf.aml.client.scala.model.document.Dialect import amf.apicontract.client.scala.model.domain.security.{ OAuth1Settings, OAuth2Flow, @@ -11,6 +10,7 @@ import org.mulesoft.als.suggestions.RawSuggestion import org.mulesoft.als.suggestions.aml.AmlCompletionRequest import org.mulesoft.als.suggestions.interfaces.AMLCompletionPlugin import org.mulesoft.als.suggestions.plugins.aml._ +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition import org.mulesoft.amfintegration.dialect.dialects.raml.raml10.Raml10SecuritySchemesDialect import scala.concurrent.ExecutionContext.Implicits.global @@ -27,18 +27,18 @@ object SecuritySettingsFacetsCompletionPlugin extends AMLCompletionPlugin { request.branchStack.exists(_.isInstanceOf[ParametrizedSecurityScheme]) request.amfObject match { case _: OAuth1Settings if !fromReference => - Raml10SecuritySchemesDialect.OAuth1Settings.propertiesRaw(fromDialect = request.actualDialect) + Raml10SecuritySchemesDialect.OAuth1Settings.propertiesRaw(fromDefinition = request.actualDocumentDefinition) case _: OAuth2Settings if fromReference => Seq(RawSuggestion.arrayProp("scopes", "security")) case _: OAuth2Settings | _: OAuth2Flow if !fromReference => - oauth2Settings(request.actualDialect) + oauth2Settings(request.actualDocumentDefinition) case _ => Nil } } } } - private def oauth2Settings(d: Dialect) = + private def oauth2Settings(d: DocumentDefinition) = Raml10SecuritySchemesDialect.OAuth2Flows - .propertiesRaw(fromDialect = d) ++ Raml10SecuritySchemesDialect.OAuth2Settings.propertiesRaw(fromDialect = d) + .propertiesRaw(fromDefinition = d) ++ Raml10SecuritySchemesDialect.OAuth2Settings.propertiesRaw(fromDefinition = d) } diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/raml08/Raml08SecuritySchemeStructureCompletionPlugin.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/raml08/Raml08SecuritySchemeStructureCompletionPlugin.scala index 851547a575..e6c12bcd92 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/raml08/Raml08SecuritySchemeStructureCompletionPlugin.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/raml08/Raml08SecuritySchemeStructureCompletionPlugin.scala @@ -17,12 +17,12 @@ object Raml08SecuritySchemeStructureCompletionPlugin extends AMLCompletionPlugin Future { request.amfObject match { case s: SecurityScheme if request.astPartBranch.isKeyDescendantOf("describedBy") => - Raml08SecuritySchemesDialect.DescribedBy.propertiesRaw(fromDialect = request.actualDialect) + Raml08SecuritySchemesDialect.DescribedBy.propertiesRaw(fromDefinition = request.actualDocumentDefinition) case s: SecurityScheme if request.fieldEntry.isEmpty && request.astPartBranch.isKey => val suggestions = new AMLStructureCompletionsPlugin( Raml08SecuritySchemesDialect.SecurityScheme.propertiesMapping(), - request.actualDialect + request.actualDocumentDefinition ) .resolve( Raml08SecuritySchemesDialect.SecurityScheme.meta.`type`.head diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/raml08/Raml08TypeFacetsCompletionPlugin.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/raml08/Raml08TypeFacetsCompletionPlugin.scala index f135676b54..731880ad02 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/raml08/Raml08TypeFacetsCompletionPlugin.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/raml08/Raml08TypeFacetsCompletionPlugin.scala @@ -25,12 +25,12 @@ object Raml08TypeFacetsCompletionPlugin extends WebApiTypeFacetsCompletionPlugin override def resolve(params: AmlCompletionRequest): Future[Seq[RawSuggestion]] = { Future.successful(params.amfObject match { case shape: Shape - if isWritingFacet(params.astPartBranch, shape, params.branchStack, params.actualDialect) && + if isWritingFacet(params.astPartBranch, shape, params.branchStack, params.actualDocumentDefinition) && !isWritingKeyMediaType(params) && !insideMediaType(params) => - resolveShape(shape, params.branchStack, params.actualDialect) + resolveShape(shape, params.branchStack, params.actualDocumentDefinition) case shape: Shape - if isWritingFacet(params.astPartBranch, shape, params.branchStack, params.actualDialect) && + if isWritingFacet(params.astPartBranch, shape, params.branchStack, params.actualDocumentDefinition) && !isWritingKeyMediaType(params) => { if (insideFormMediaType(params)) diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/raml10/Raml10SecuritySchemeStructureCompletionPlugin.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/raml10/Raml10SecuritySchemeStructureCompletionPlugin.scala index edc324b9cd..86f0e074da 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/raml10/Raml10SecuritySchemeStructureCompletionPlugin.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/raml10/Raml10SecuritySchemeStructureCompletionPlugin.scala @@ -17,12 +17,12 @@ object Raml10SecuritySchemeStructureCompletionPlugin extends AMLCompletionPlugin Future { request.amfObject match { case s: SecurityScheme if request.astPartBranch.isKeyDescendantOf("describedBy") => - Raml10SecuritySchemesDialect.DescribedBy.propertiesRaw(fromDialect = request.actualDialect) + Raml10SecuritySchemesDialect.DescribedBy.propertiesRaw(fromDefinition = request.actualDocumentDefinition) case s: SecurityScheme if request.fieldEntry.isEmpty && request.astPartBranch.isKey => val suggestions = new AMLStructureCompletionsPlugin( Raml10SecuritySchemesDialect.SecurityScheme.propertiesMapping(), - request.actualDialect + request.actualDocumentDefinition ) .resolve(Raml10SecuritySchemesDialect.SecurityScheme.nodetypeMapping.value()) if ( diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/raml10/structure/ResolveShapeAndSecurity.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/raml10/structure/ResolveShapeAndSecurity.scala index 9ec1540984..a789212a4c 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/raml10/structure/ResolveShapeAndSecurity.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/aml/webapi/raml/raml10/structure/ResolveShapeAndSecurity.scala @@ -22,9 +22,9 @@ object ResolveShapeAndSecurity extends ResolveIfApplies { case _: Request => applies( Future { - request.actualDialect + request.actualDocumentDefinition .findNodeMappingByTerm(OperationModel.`type`.head.iri()) - .map(n => n.propertiesRaw(fromDialect = request.actualDialect)) + .map(n => n.propertiesRaw(fromDefinition = request.actualDocumentDefinition)) .getOrElse(Nil) } ) diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/headers/AMLHeadersCompletionPlugin.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/headers/AMLHeadersCompletionPlugin.scala index 1dd0be2180..01457c1562 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/headers/AMLHeadersCompletionPlugin.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/headers/AMLHeadersCompletionPlugin.scala @@ -1,10 +1,9 @@ package org.mulesoft.als.suggestions.plugins.headers -import amf.aml.client.scala.model.document.Dialect import org.mulesoft.als.configuration.Configuration import org.mulesoft.als.suggestions.interfaces.HeaderCompletionPlugin import org.mulesoft.als.suggestions.{HeaderCompletionParams, RawSuggestion} -import org.mulesoft.amfintegration.amfconfiguration.AmfParseContext +import org.mulesoft.amfintegration.amfconfiguration.{AmfParseContext, DocumentDefinition} import org.mulesoft.amfintegration.dialect.dialects.metadialect.{MetaDialect, VocabularyDialect} import scala.concurrent.Future @@ -13,11 +12,11 @@ object AMLHeadersCompletionPlugin extends HeaderCompletionPlugin { override def id: String = "AMLHeadersCompletionPlugin" def allHeaders(amfConfiguration: AmfParseContext): Seq[String] = - (amfConfiguration.state.allDialects - .filterNot(d => Configuration.internalDialects.contains(d.id)) - .filterNot(d => Option(d.documents()).exists(_.keyProperty().value())) ++ Seq( - MetaDialect.dialect, - VocabularyDialect.dialect + (amfConfiguration.state.allDefinitions + .filterNot(d => Configuration.internalDialects.contains(d.baseUnit.id)) + .filterNot(d => d.documents().exists(_.keyProperty().value())) ++ Seq( + DocumentDefinition(MetaDialect.dialect), + DocumentDefinition(VocabularyDialect.dialect) )) .flatMap(computeHeaders) .distinct @@ -30,18 +29,16 @@ object AMLHeadersCompletionPlugin extends HeaderCompletionPlugin { else Seq() ) - private def computeHeaders(dialect: Dialect) = { - - Seq(s"#%${dialect.nameAndVersion()}") ++ - Option(dialect.documents()) + private def computeHeaders(documentDefinition: DocumentDefinition) = + Seq(s"#%${documentDefinition.nameAndVersion()}") ++ + documentDefinition.documents() .flatMap(d => Option(d.library())) - .map(_ => s"#%Library / ${dialect.nameAndVersion()}") ++ - Option(dialect.documents()) + .map(_ => s"#%Library / ${documentDefinition.nameAndVersion()}") ++ + documentDefinition.documents() .map(_.fragments()) .getOrElse(Seq.empty) .map { fragment => - s"#%${fragment.documentName().value()} / ${dialect.nameAndVersion()}" + s"#%${fragment.documentName().value()} / ${documentDefinition.nameAndVersion()}" } ++ - Option(s"#%Patch / ${dialect.nameAndVersion()}") - } + Option(s"#%Patch / ${documentDefinition.nameAndVersion()}") } diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/headers/KeyPropertyHeaderCompletionPlugin.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/headers/KeyPropertyHeaderCompletionPlugin.scala index 5f1e1ed607..b6e2b9ff2f 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/headers/KeyPropertyHeaderCompletionPlugin.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/headers/KeyPropertyHeaderCompletionPlugin.scala @@ -1,12 +1,11 @@ package org.mulesoft.als.suggestions.plugins.headers -import amf.aml.client.scala.model.document.Dialect import amf.core.internal.remote.{FileMediaType, Spec} import org.mulesoft.als.common.dtoTypes.Position -import org.mulesoft.als.configuration.{AlsConfigurationReader, Configuration, TemplateTypes} +import org.mulesoft.als.configuration.{AlsConfigurationReader, TemplateTypes} import org.mulesoft.als.suggestions.interfaces.HeaderCompletionPlugin import org.mulesoft.als.suggestions.{HeaderCompletionParams, RawSuggestion} -import org.mulesoft.amfintegration.amfconfiguration.ALSConfigurationState +import org.mulesoft.amfintegration.amfconfiguration.{ALSConfigurationState, DocumentDefinition} import scala.concurrent.Future @@ -71,14 +70,14 @@ class KeyPropertyHeaderCompletionPlugin( s"{\n${text.linesIterator.map(l => s" $l").mkString("\n")}\n}" private def getSuggestions: Seq[RawSuggestion] = { - configurationState.allDialects - .filter(d => Option(d.documents()).exists(_.keyProperty().value())) + configurationState.allDefinitions + .filter(d => d.documents().exists(_.keyProperty().value())) .filter(compliesFormat) .map(d => { val Flavour(text, label, isASnippet) = if (isJson) - jsonFlavour(purgeName(d), d.version().value(), hasBracket, position) - else yamlFlavour(purgeName(d), d.version().value()) + jsonFlavour(purgeName(d), d.version().getOrElse(""), hasBracket, position) + else yamlFlavour(purgeName(d), d.version().getOrElse("")) new RawSuggestion(text, label.trim, s"Define a ${purgedNameAndVersion(d)} file", Seq(), children = Nil) }) @@ -86,22 +85,22 @@ class KeyPropertyHeaderCompletionPlugin( } /** only suggest $schema for json documents - * @param dialect + * @param documentDefinition * @return */ - private def compliesFormat(dialect: Dialect): Boolean = + private def compliesFormat(documentDefinition: DocumentDefinition): Boolean = if (!isJson) - !isJsonSchema(dialect) + !isJsonSchema(documentDefinition) else true - private def isJsonSchema(dialect: Dialect) = - dialect.name().option().contains(Spec.JSONSCHEMA.toString) + private def isJsonSchema(documentDefinition: DocumentDefinition) = + documentDefinition.name().contains(Spec.JSONSCHEMA.toString) - private def purgeName(d: Dialect) = + private def purgeName(d: DocumentDefinition) = if (isJsonSchema(d)) "$schema" - else d.name().value() + else d.name().getOrElse("") - private def purgedNameAndVersion(d: Dialect) = { + private def purgedNameAndVersion(d: DocumentDefinition) = { val nameAndVersion = d.nameAndVersion() if (nameAndVersion == "swagger 2.0") "openapi 2.0" else nameAndVersion diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/jsonschema/JsonSchemaStructureCompletionPlugin.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/jsonschema/JsonSchemaStructureCompletionPlugin.scala new file mode 100644 index 0000000000..f81ad3c24f --- /dev/null +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/plugins/jsonschema/JsonSchemaStructureCompletionPlugin.scala @@ -0,0 +1,23 @@ +package org.mulesoft.als.suggestions.plugins.jsonschema + +import org.mulesoft.als.suggestions.RawSuggestion +import org.mulesoft.als.suggestions.aml.AmlCompletionRequest +import org.mulesoft.als.suggestions.interfaces.AMLCompletionPlugin +import org.mulesoft.amfintegration.amfconfiguration.executioncontext.Implicits.global + +import scala.concurrent.Future + +object JsonSchemaStructureCompletionPlugin extends AMLCompletionPlugin{ + + override def id: String = "JsonSchemaStructureCompletionPlugin" + + override def resolve(request: AmlCompletionRequest): Future[Seq[RawSuggestion]] = + if(!applies(request)) emptySuggestion + else Future { + // todo: need more info from AMF to link amfElements to it definition node (TD needed) + Nil + } + + private def applies(request: AmlCompletionRequest): Boolean = + request.astPartBranch.isKeyLike +} diff --git a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/util/DialectFinderByMediaType.scala b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/util/DialectFinderByMediaType.scala index 21f0a2cde5..6d90de804f 100644 --- a/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/util/DialectFinderByMediaType.scala +++ b/als-suggestions/shared/src/main/scala/org/mulesoft/als/suggestions/util/DialectFinderByMediaType.scala @@ -1,7 +1,7 @@ package org.mulesoft.als.suggestions.util -import amf.aml.client.scala.model.document.Dialect import amf.apicontract.client.scala.model.domain.Payload +import org.mulesoft.amfintegration.amfconfiguration.DocumentDefinition import org.mulesoft.amfintegration.dialect.dialects.asyncapi20.AsyncApi20Dialect import org.mulesoft.amfintegration.dialect.dialects.avro.AvroDialect import org.mulesoft.amfintegration.dialect.dialects.jsonschema.draft4.JsonSchemaDraft4Dialect @@ -26,15 +26,15 @@ trait DialectFinderByMediaType { "(application\\/vnd\\.apache\\.avro;?(version=1\\.[0-9]\\.[0-9])?)".r // TODO: Add all Dialects to this util - def findDialectFromPayload(payload: Payload): Dialect = { + def findDialectFromPayload(payload: Payload): DocumentDefinition = { payload.schemaMediaType.value() match { - case asyncApiRegex(_*) => AsyncApi20Dialect.dialect - case jsonRegex07(_*) => JsonSchemaDraft7Dialect.dialect - case jsonRegex04(_*) => JsonSchemaDraft4Dialect.dialect - case oas3Regex(_*) => OAS30Dialect.dialect - case raml10Regex(_*) => Raml10TypesDialect.dialect - case avroRegex(_*) => AvroDialect.dialect - case _ => AsyncApi20Dialect.dialect + case asyncApiRegex(_*) => DocumentDefinition(AsyncApi20Dialect.dialect) + case jsonRegex07(_*) => DocumentDefinition(JsonSchemaDraft7Dialect.dialect) + case jsonRegex04(_*) => DocumentDefinition(JsonSchemaDraft4Dialect.dialect) + case oas3Regex(_*) => DocumentDefinition(OAS30Dialect.dialect) + case raml10Regex(_*) => DocumentDefinition(Raml10TypesDialect.dialect) + case avroRegex(_*) => DocumentDefinition(AvroDialect.dialect) + case _ => DocumentDefinition(AsyncApi20Dialect.dialect) } } } diff --git a/als-suggestions/shared/src/test/scala/org/mulesoft/als/suggestions/test/SuggestionsTest.scala b/als-suggestions/shared/src/test/scala/org/mulesoft/als/suggestions/test/SuggestionsTest.scala index 18f03a54a5..b9135cf8d7 100644 --- a/als-suggestions/shared/src/test/scala/org/mulesoft/als/suggestions/test/SuggestionsTest.scala +++ b/als-suggestions/shared/src/test/scala/org/mulesoft/als/suggestions/test/SuggestionsTest.scala @@ -138,8 +138,10 @@ trait SuggestionsTest extends AsyncFunSuite with BaseSuggestionsForTest { case class ModelResult(u: BaseUnit, url: String, position: Int, originalContent: Option[String]) - def parseAMF(url: String): Future[BaseUnit] = + def parseAMF(url: String): Future[BaseUnit] = { + // todo: add mcp check, maybe global object getConfig(uri): Option[ShapeConf] APIConfiguration.APIWithJsonSchema().baseUnitClient().parse(url).map(_.baseUnit) + } def filePath(path: String): String = { var result = diff --git a/als-suggestions/shared/src/test/scala/org/mulesoft/als/suggestions/test/core/AccessBundle.scala b/als-suggestions/shared/src/test/scala/org/mulesoft/als/suggestions/test/core/AccessBundle.scala index b372bdb3b8..ee26924e8c 100644 --- a/als-suggestions/shared/src/test/scala/org/mulesoft/als/suggestions/test/core/AccessBundle.scala +++ b/als-suggestions/shared/src/test/scala/org/mulesoft/als/suggestions/test/core/AccessBundle.scala @@ -9,5 +9,5 @@ import scala.concurrent.Future trait AccessBundle { def accessBundle(alsConfigurationState: ALSConfigurationState)(uri: String): Future[UnitBundle] = - alsConfigurationState.parse(uri).map(r => UnitBundle(r.result.baseUnit, r.definedBy, r.context)) + alsConfigurationState.parse(uri).map(r => UnitBundle(r.result.baseUnit, r.documentDefinition, r.context)) } diff --git a/als-suggestions/shared/src/test/scala/org/mulesoft/als/suggestions/test/oas30/Oas30ComponentSuggestionTest.scala b/als-suggestions/shared/src/test/scala/org/mulesoft/als/suggestions/test/oas30/Oas30ComponentSuggestionTest.scala index f3603d9600..f0330ba594 100644 --- a/als-suggestions/shared/src/test/scala/org/mulesoft/als/suggestions/test/oas30/Oas30ComponentSuggestionTest.scala +++ b/als-suggestions/shared/src/test/scala/org/mulesoft/als/suggestions/test/oas30/Oas30ComponentSuggestionTest.scala @@ -3,6 +3,7 @@ package org.mulesoft.als.suggestions.test.oas30 import amf.apicontract.client.scala.{AMFConfiguration, OASConfiguration} import amf.core.client.scala.AMFGraphConfiguration import amf.core.client.scala.resource.ResourceLoader +import amf.shapes.client.scala.ShapesConfiguration import org.mulesoft.als.configuration.ProjectConfiguration import org.mulesoft.als.suggestions.test.{BaseSuggestionsForTest, TestProjectConfigurationState} import org.mulesoft.amfintegration.amfconfiguration.{ALSConfigurationState, EditorConfigurationState} @@ -93,7 +94,7 @@ class Oas30ComponentSuggestionTest extends AsyncFunSuite with BaseSuggestionsFor resourceLoader: ResourceLoader ): ALSConfigurationState = new ALSConfigurationState(configurationState.editorState, configurationState.projectState, Some(resourceLoader)) { - override def getAmfConfig(asMain: Boolean = false): AMFConfiguration = + override def getAmfConfig(asMain: Boolean = false): ShapesConfiguration = getAmfConfig(OASConfiguration.OAS30Component(), asMain) } } diff --git a/build.sbt b/build.sbt index 93607aaad6..e5dc75a536 100755 --- a/build.sbt +++ b/build.sbt @@ -40,6 +40,12 @@ lazy val amfJSRef = ProjectRef(workspaceDirectory / "amf", "graphqlJS") lazy val amfLibJVM = "com.github.amlorg" %% "amf-graphql" % amfVersion lazy val amfLibJS = "com.github.amlorg" %% "amf-graphql_sjs1" % amfVersion + +lazy val amfMcpJVMRef = ProjectRef(workspaceDirectory / "amf", "mcpJVM") +lazy val amfMcpJSRef = ProjectRef(workspaceDirectory / "amf", "mcpJS") +lazy val amfMcpLibJVM = "com.github.amlorg" %% "amf-mcp" % amfVersion +lazy val amfMcpLibJS = "com.github.amlorg" %% "amf-mcp_sjs1" % amfVersion + lazy val customValidatorWebJVMRef = ProjectRef(workspaceDirectory / "amf-custom-validator-scalajs", "amfCustomValidatorWebJVM") lazy val customValidatorWebJSRef = @@ -153,10 +159,12 @@ lazy val common = crossProject(JSPlatform, JVMPlatform) lazy val commonJVM = common.jvm .in(file(s"$pathAlsCommon/jvm")) .sourceDependency(amfJVMRef, amfLibJVM) + .sourceDependency(amfMcpJVMRef, amfMcpLibJVM) .sourceDependency(customValidatorWebJVMRef, customValidatorWebLibJVM) lazy val commonJS = common.js .in(file(s"$pathAlsCommon/js")) .sourceDependency(amfJSRef, amfLibJS) + .sourceDependency(amfMcpJSRef, amfMcpLibJS) .sourceDependency(customValidatorWebJSRef, customValidatorWebLibJS) .disablePlugins(SonarPlugin, ScoverageSbtPlugin) ////endregion diff --git a/dependencies.properties b/dependencies.properties index a610b7d22d..9a6b02b6c0 100644 --- a/dependencies.properties +++ b/dependencies.properties @@ -1,5 +1,5 @@ version=7.1.0-SNAPSHOT -amf=5.7.1 +amf=5.8.0-SNAPSHOT amf.custom-validator.js=1.7.5 amf.custom-validator-scalajs=0.7.1 amf-antlr-parsers=0.8.28