From 913c69eeb364c3c21a29efe6ebadb648d56573a8 Mon Sep 17 00:00:00 2001 From: Matt <85322+mattmassicotte@users.noreply.github.com> Date: Wed, 15 May 2024 07:06:40 -0400 Subject: [PATCH] OCaml language support #16 --- Configurations/NonSwiftWorkaround.xcconfig | 3 +- Edit.xcodeproj/project.pbxproj | 37 +++++++++++++++++++ .../xcshareddata/swiftpm/Package.resolved | 11 +++++- .../LanguageProfile+Profiles.swift | 15 ++++++++ Edit/Resources/Info.plist | 17 +++++++++ EditIntents/HighlightIntent.swift | 9 +++-- 6 files changed, 87 insertions(+), 5 deletions(-) diff --git a/Configurations/NonSwiftWorkaround.xcconfig b/Configurations/NonSwiftWorkaround.xcconfig index c88c248..fa893f1 100644 --- a/Configurations/NonSwiftWorkaround.xcconfig +++ b/Configurations/NonSwiftWorkaround.xcconfig @@ -1,5 +1,6 @@ // This is a workaround for a ridiculous problem related to non-Swift SPM dependencies. However, the linker will be unhappy if these modulemap files don't exist. So dependency management can get a little tricky. // - "Internal" is for TextStory // - "tree-sitter" is for SwiftTreeSitter -OTHER_SWIFT_FLAGS = $(inherited) -Xcc -fmodule-map-file=$(GENERATED_MODULEMAP_DIR)/Internal.modulemap -Xcc -fmodule-map-file=$(GENERATED_MODULEMAP_DIR)/tree-sitter.modulemap -Xcc -fmodule-map-file=$(GENERATED_MODULEMAP_DIR)/TreeSitterSwift.modulemap -Xcc -fmodule-map-file=$(GENERATED_MODULEMAP_DIR)/TreeSitterMarkdown.modulemap -Xcc -fmodule-map-file=$(GENERATED_MODULEMAP_DIR)/TreeSitterMarkdownInline.modulemap -Xcc -fmodule-map-file=$(GENERATED_MODULEMAP_DIR)/TreeSitterGo.modulemap +OTHER_SWIFT_FLAGS = $(inherited) -Xcc -fmodule-map-file=$(GENERATED_MODULEMAP_DIR)/Internal.modulemap -Xcc -fmodule-map-file=$(GENERATED_MODULEMAP_DIR)/tree-sitter.modulemap -Xcc -fmodule-map-file=$(GENERATED_MODULEMAP_DIR)/TreeSitterGo.modulemap -Xcc -fmodule-map-file=$(GENERATED_MODULEMAP_DIR)/TreeSitterMarkdown.modulemap -Xcc -fmodule-map-file=$(GENERATED_MODULEMAP_DIR)/TreeSitterMarkdownInline.modulemap -Xcc -fmodule-map-file=$(GENERATED_MODULEMAP_DIR)/TreeSitterOCaml.modulemap -Xcc -fmodule-map-file=$(GENERATED_MODULEMAP_DIR)/TreeSitterSwift.modulemap + diff --git a/Edit.xcodeproj/project.pbxproj b/Edit.xcodeproj/project.pbxproj index bcf51c1..ca56d88 100644 --- a/Edit.xcodeproj/project.pbxproj +++ b/Edit.xcodeproj/project.pbxproj @@ -160,6 +160,7 @@ C9BFA1B72BC162EF00E86487 /* NSUI in Frameworks */ = {isa = PBXBuildFile; productRef = C9BFA1B62BC162EF00E86487 /* NSUI */; }; C9CDEB552B504485009E252A /* TextSystem+SwiftTreeSitterLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9CDEB542B504485009E252A /* TextSystem+SwiftTreeSitterLayer.swift */; }; C9CDEB8F2B56ACA3009E252A /* MainOffender in Frameworks */ = {isa = PBXBuildFile; productRef = C9CDEB8E2B56ACA3009E252A /* MainOffender */; }; + C9CFCF752BF4CBE80053C9A6 /* TreeSitterOCaml in Frameworks */ = {isa = PBXBuildFile; productRef = C9CFCF742BF4CBE80053C9A6 /* TreeSitterOCaml */; }; C9DCE1502BD7BFF30067D354 /* ThemeStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9DCE14F2BD7BFF30067D354 /* ThemeStore.swift */; }; C9DCE1562BD8049F0067D354 /* ObservableState.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9DCE1552BD8049F0067D354 /* ObservableState.swift */; }; C9E0B9F72BD1A3CE007AF034 /* DiagnosticsStatusBarItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9E0B9F62BD1A3CE007AF034 /* DiagnosticsStatusBarItem.swift */; }; @@ -1129,6 +1130,7 @@ C96B61F32BDA70DA00561DE8 /* libEditor.a in Frameworks */, C95B91302BD98C76006FDD00 /* libDocumentContent.a in Frameworks */, C95B91232BD98B64006FDD00 /* libTextSystem.a in Frameworks */, + C9CFCF752BF4CBE80053C9A6 /* TreeSitterOCaml in Frameworks */, C95B91222BD98B4D006FDD00 /* libSyntaxService.a in Frameworks */, C96B61FD2BDA714700561DE8 /* ScrollViewPlus in Frameworks */, C95B91342BD98CA1006FDD00 /* SwiftTreeSitter in Frameworks */, @@ -2143,6 +2145,7 @@ buildRules = ( ); dependencies = ( + C9CFCF772BF4CC1E0053C9A6 /* PBXTargetDependency */, C96B62022BDA71FE00561DE8 /* PBXTargetDependency */, C96B61FB2BDA714000561DE8 /* PBXTargetDependency */, C96B61F92BDA711B00561DE8 /* PBXTargetDependency */, @@ -2177,6 +2180,7 @@ C95B913D2BD98D01006FDD00 /* SwiftTreeSitterLayer */, C96B61FC2BDA714700561DE8 /* ScrollViewPlus */, C96B62052BDA721100561DE8 /* SourceView */, + C9CFCF742BF4CBE80053C9A6 /* TreeSitterOCaml */, ); productName = EditKit; productReference = C92931422B80CC6700C64DDE /* EditKit.framework */; @@ -2364,6 +2368,7 @@ buildRules = ( ); dependencies = ( + C9CFCF792BF4CC960053C9A6 /* PBXTargetDependency */, C941F0B32B7102E80003B640 /* PBXTargetDependency */, C9CDEB912B56ACBB009E252A /* PBXTargetDependency */, C9CDEB632B51942E009E252A /* PBXTargetDependency */, @@ -2930,6 +2935,7 @@ C9BFA1AE2BC0927A00E86487 /* XCRemoteSwiftPackageReference "Glyph" */, C9E0BA3A2BD2EB05007AF034 /* XCRemoteSwiftPackageReference "ThemePark" */, C93F72252BF0F9290021ACF3 /* XCRemoteSwiftPackageReference "Sparkle" */, + C9CFCF732BF4CBE80053C9A6 /* XCRemoteSwiftPackageReference "tree-sitter-ocaml" */, ); productRefGroup = C9FE529A2A7525D000CACA1A /* Products */; projectDirPath = ""; @@ -3871,6 +3877,14 @@ isa = PBXTargetDependency; productRef = C9CDEB902B56ACBB009E252A /* MainOffender */; }; + C9CFCF772BF4CC1E0053C9A6 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + productRef = C9CFCF762BF4CC1E0053C9A6 /* TreeSitterOCaml */; + }; + C9CFCF792BF4CC960053C9A6 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + productRef = C9CFCF782BF4CC960053C9A6 /* TreeSitterOCaml */; + }; C9DCE14E2BD7BC500067D354 /* PBXTargetDependency */ = { isa = PBXTargetDependency; productRef = C9DCE14D2BD7BC500067D354 /* ThemePark */; @@ -4929,6 +4943,14 @@ minimumVersion = 0.1.0; }; }; + C9CFCF732BF4CBE80053C9A6 /* XCRemoteSwiftPackageReference "tree-sitter-ocaml" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/tree-sitter/tree-sitter-ocaml"; + requirement = { + branch = master; + kind = branch; + }; + }; C9E0BA3A2BD2EB05007AF034 /* XCRemoteSwiftPackageReference "ThemePark" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/ChimeHQ/ThemePark"; @@ -5261,6 +5283,21 @@ package = C9CDEB8D2B56ACA3009E252A /* XCRemoteSwiftPackageReference "MainOffender" */; productName = MainOffender; }; + C9CFCF742BF4CBE80053C9A6 /* TreeSitterOCaml */ = { + isa = XCSwiftPackageProductDependency; + package = C9CFCF732BF4CBE80053C9A6 /* XCRemoteSwiftPackageReference "tree-sitter-ocaml" */; + productName = TreeSitterOCaml; + }; + C9CFCF762BF4CC1E0053C9A6 /* TreeSitterOCaml */ = { + isa = XCSwiftPackageProductDependency; + package = C9CFCF732BF4CBE80053C9A6 /* XCRemoteSwiftPackageReference "tree-sitter-ocaml" */; + productName = TreeSitterOCaml; + }; + C9CFCF782BF4CC960053C9A6 /* TreeSitterOCaml */ = { + isa = XCSwiftPackageProductDependency; + package = C9CFCF732BF4CBE80053C9A6 /* XCRemoteSwiftPackageReference "tree-sitter-ocaml" */; + productName = TreeSitterOCaml; + }; C9DCE14D2BD7BC500067D354 /* ThemePark */ = { isa = XCSwiftPackageProductDependency; package = C9E0BA3A2BD2EB05007AF034 /* XCRemoteSwiftPackageReference "ThemePark" */; diff --git a/Edit.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Edit.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index f507c9a..86f843a 100644 --- a/Edit.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Edit.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "78a8897458ae353ab1f4fd14e2c55be0dba3fe7c46fb08bf337134a46b1e4ea1", + "originHash" : "5a57c719e79b0a39e32c853b3d8e18f925cbf132ebb27828399c403312eb262e", "pins" : [ { "identity" : "asyncxpcconnection", @@ -258,6 +258,15 @@ "revision" : "f9820b2db958228f9be339b67d2de874d065866e" } }, + { + "identity" : "tree-sitter-ocaml", + "kind" : "remoteSourceControl", + "location" : "https://github.com/tree-sitter/tree-sitter-ocaml", + "state" : { + "branch" : "master", + "revision" : "0b12614ded3ec7ed7ab7933a9ba4f695ba4c342e" + } + }, { "identity" : "tree-sitter-swift", "kind" : "remoteSourceControl", diff --git a/Edit/Modules/SyntaxService/LanguageProfile+Profiles.swift b/Edit/Modules/SyntaxService/LanguageProfile+Profiles.swift index c6b07cb..65d80b0 100644 --- a/Edit/Modules/SyntaxService/LanguageProfile+Profiles.swift +++ b/Edit/Modules/SyntaxService/LanguageProfile+Profiles.swift @@ -4,6 +4,7 @@ import SwiftTreeSitter import UniformTypeIdentifiers import TreeSitterGo +import TreeSitterOCaml import TreeSitterMarkdown import TreeSitterMarkdownInline import TreeSitterSwift @@ -18,6 +19,10 @@ extension LanguageProfile { return LanguageProfile.markdownInlineProfile } + if utType.conforms(to: .ocamlSource) { + return LanguageProfile.ocamlProfile + } + if utType.conforms(to: .swiftSource) { return LanguageProfile.swiftProfile } @@ -47,6 +52,16 @@ extension LanguageProfile { bundleName: "TreeSitterMarkdown_TreeSitterMarkdownInline" ) + static let ocamlProfile = LanguageProfile( + name: "OCaml", + language: Language(tree_sitter_ocaml()) + ) + + static let ocamlInterfaceProfile = LanguageProfile( + name: "OCaml", + language: Language(tree_sitter_ocaml_interface()) + ) + static let swiftProfile = LanguageProfile( name: "Swift", language: Language(tree_sitter_swift()) diff --git a/Edit/Resources/Info.plist b/Edit/Resources/Info.plist index b525c46..9d7791e 100644 --- a/Edit/Resources/Info.plist +++ b/Edit/Resources/Info.plist @@ -67,6 +67,23 @@ https://updates.chimehq.com/com.chimehq.Edit/appcast.xml UTImportedTypeDeclarations + + UTTypeConformsTo + + public.source-code + + UTTypeDescription + OCaml Source + UTTypeIdentifier + org.ocaml.ocaml + UTTypeTagSpecification + + public.filename-extension + + ml + + + UTTypeConformsTo diff --git a/EditIntents/HighlightIntent.swift b/EditIntents/HighlightIntent.swift index 8f86acc..832ac44 100644 --- a/EditIntents/HighlightIntent.swift +++ b/EditIntents/HighlightIntent.swift @@ -10,15 +10,17 @@ import UniformTypeIdentifiers /// /// This must be defined within the same module as any AppIntent that uses it. public enum RootLanguage: String, Hashable, CaseIterable, Sendable { - case swift = "Swift" case go = "Go" case markdown = "Markdown" + case ocaml = "OCaml" + case swift = "Swift" var typeIdentifier: UTType { switch self { - case .swift: .swiftSource case .go: .goSource case .markdown: .markdown + case .ocaml: .ocamlSource + case .swift: .swiftSource } } } @@ -27,9 +29,10 @@ extension RootLanguage: AppEnum { public static var typeDisplayRepresentation: TypeDisplayRepresentation { "Language" } public static var caseDisplayRepresentations: [RootLanguage: DisplayRepresentation] { [ - .swift: "Swift", .go: "Go", .markdown: "Markdown", + .ocaml: "OCaml", + .swift: "Swift", ] } }