@@ -25,8 +25,10 @@ import Share.Postgres.Causal.Queries qualified as CausalQ
2525import Share.Postgres.IDs (CausalId )
2626import Share.Postgres.NameLookups.Ops qualified as NameLookupOps
2727import Share.Prelude
28+ import Share.Utils.Caching.JSON qualified as Caching
2829import Unison.Codebase.Editor.DisplayObject (DisplayObject )
2930import Unison.Codebase.Path (Path )
31+ import Unison.Codebase.Path qualified as Path
3032import Unison.ConstructorReference qualified as ConstructorReference
3133import Unison.DataDeclaration qualified as DD
3234import Unison.DataDeclaration.Dependencies qualified as DD
@@ -79,51 +81,63 @@ definitionForHQName ::
7981 HQ. HashQualified Name ->
8082 Codebase. CodebaseM e DefinitionDisplayResults
8183definitionForHQName perspective rootCausalId renderWidth suffixifyBindings rt perspectiveQuery = do
82- rootBranchNamespaceHashId <- CausalQ. expectNamespaceIdsByCausalIdsOf id rootCausalId
83- (namesPerspective, query) <- NameLookupOps. relocateToNameRoot perspective perspectiveQuery rootBranchNamespaceHashId
84- Debug. debugM Debug. Server " definitionForHQName: (namesPerspective, query)" (namesPerspective, query)
85- -- Bias towards both relative and absolute path to queries,
86- -- This allows us to still bias towards definitions outside our namesRoot but within the
87- -- same tree;
88- -- e.g. if the query is `map` and we're in `base.trunk.List`,
89- -- we bias towards `map` and `.base.trunk.List.map` which ensures we still prefer names in
90- -- `trunk` over those in other releases.
91- -- ppe which returns names fully qualified to the current namesRoot, not to the codebase root.
92- let biases = maybeToList $ HQ. toName query
93- let ppedBuilder deps = (PPED. biasTo biases) <$> lift (PPEPostgres. ppedForReferences namesPerspective deps)
94- let nameSearch = PGNameSearch. nameSearchForPerspective namesPerspective
95- dr@ (Backend. DefinitionResults terms types misses) <- mkDefinitionsForQuery nameSearch [query]
96- Debug. debugM Debug. Server " definitionForHQName: found definitions" dr
97- let width = mayDefaultWidth renderWidth
98- let docResults :: Name -> Codebase. CodebaseM e [(HashQualifiedName , UnisonHash , Doc. Doc )]
99- docResults name = do
100- Debug. debugM Debug. Server " definitionForHQName: looking up docs for name" name
101- docRefs <- Docs. docsForDefinitionName nameSearch name
102- Debug. debugM Debug. Server " definitionForHQName: Found these docs" docRefs
103- renderDocRefs ppedBuilder width rt docRefs
84+ codebaseOwnerUserId <- asks Codebase. codebaseOwner
85+ let cacheKey =
86+ Caching. CacheKey
87+ { cacheTopic = " definitionForHQName" ,
88+ key = [(" perspective" , Path. toText perspective), (" suffixify" , tShow $ suffixified (suffixifyBindings)), (" hqName" , HQ. toText perspectiveQuery), (" width" , tShow renderWidth)],
89+ rootCausalId = Just rootCausalId,
90+ sandbox = Just codebaseOwnerUserId
91+ }
92+ Caching. usingJSONCache cacheKey go
93+ where
94+ go :: Codebase. CodebaseM e DefinitionDisplayResults
95+ go = do
96+ rootBranchNamespaceHashId <- CausalQ. expectNamespaceIdsByCausalIdsOf id rootCausalId
97+ (namesPerspective, query) <- NameLookupOps. relocateToNameRoot perspective perspectiveQuery rootBranchNamespaceHashId
98+ Debug. debugM Debug. Server " definitionForHQName: (namesPerspective, query)" (namesPerspective, query)
99+ -- Bias towards both relative and absolute path to queries,
100+ -- This allows us to still bias towards definitions outside our namesRoot but within the
101+ -- same tree;
102+ -- e.g. if the query is `map` and we're in `base.trunk.List`,
103+ -- we bias towards `map` and `.base.trunk.List.map` which ensures we still prefer names in
104+ -- `trunk` over those in other releases.
105+ -- ppe which returns names fully qualified to the current namesRoot, not to the codebase root.
106+ let biases = maybeToList $ HQ. toName query
107+ let ppedBuilder deps = (PPED. biasTo biases) <$> lift (PPEPostgres. ppedForReferences namesPerspective deps)
108+ let nameSearch = PGNameSearch. nameSearchForPerspective namesPerspective
109+ dr@ (Backend. DefinitionResults terms types misses) <- mkDefinitionsForQuery nameSearch [query]
110+ Debug. debugM Debug. Server " definitionForHQName: found definitions" dr
111+ let width = mayDefaultWidth renderWidth
112+ let docResults :: Name -> Codebase. CodebaseM e [(HashQualifiedName , UnisonHash , Doc. Doc )]
113+ docResults name = do
114+ Debug. debugM Debug. Server " definitionForHQName: looking up docs for name" name
115+ docRefs <- Docs. docsForDefinitionName nameSearch name
116+ Debug. debugM Debug. Server " definitionForHQName: Found these docs" docRefs
117+ renderDocRefs ppedBuilder width rt docRefs
104118
105- let drDeps = Backend. definitionResultsDependencies dr
106- termAndTypePPED <- ppedBuilder drDeps
107- let fqnTermAndTypePPE = PPED. unsuffixifiedPPE termAndTypePPED
108- typeDefinitions <-
109- ifor (Backend. typesToSyntaxOf suffixifyBindings width termAndTypePPED (Map. asList_ . traversed) types) \ ref tp -> do
110- let hqTypeName = PPE. typeNameOrHashOnly fqnTermAndTypePPE ref
111- docs <- maybe (pure [] ) docResults (HQ. toName hqTypeName)
112- lift $ Backend. mkTypeDefinition termAndTypePPED width ref docs tp
113- termDefinitions <-
114- ifor (Backend. termsToSyntaxOf suffixifyBindings width termAndTypePPED (Map. asList_ . traversed) terms) \ reference trm -> do
115- let referent = Referent. Ref reference
116- let hqTermName = PPE. termNameOrHashOnly fqnTermAndTypePPE referent
117- docs <- maybe (pure [] ) docResults (HQ. toName hqTermName)
118- Backend. mkTermDefinition termAndTypePPED width reference docs trm
119- let renderedDisplayTerms = Map. mapKeys Reference. toText termDefinitions
120- renderedDisplayTypes = Map. mapKeys Reference. toText typeDefinitions
121- renderedMisses = fmap HQ. toText misses
122- pure $
123- DefinitionDisplayResults
124- renderedDisplayTerms
125- renderedDisplayTypes
126- renderedMisses
119+ let drDeps = Backend. definitionResultsDependencies dr
120+ termAndTypePPED <- ppedBuilder drDeps
121+ let fqnTermAndTypePPE = PPED. unsuffixifiedPPE termAndTypePPED
122+ typeDefinitions <-
123+ ifor (Backend. typesToSyntaxOf suffixifyBindings width termAndTypePPED (Map. asList_ . traversed) types) \ ref tp -> do
124+ let hqTypeName = PPE. typeNameOrHashOnly fqnTermAndTypePPE ref
125+ docs <- maybe (pure [] ) docResults (HQ. toName hqTypeName)
126+ lift $ Backend. mkTypeDefinition termAndTypePPED width ref docs tp
127+ termDefinitions <-
128+ ifor (Backend. termsToSyntaxOf suffixifyBindings width termAndTypePPED (Map. asList_ . traversed) terms) \ reference trm -> do
129+ let referent = Referent. Ref reference
130+ let hqTermName = PPE. termNameOrHashOnly fqnTermAndTypePPE referent
131+ docs <- maybe (pure [] ) docResults (HQ. toName hqTermName)
132+ Backend. mkTermDefinition termAndTypePPED width reference docs trm
133+ let renderedDisplayTerms = Map. mapKeys Reference. toText termDefinitions
134+ renderedDisplayTypes = Map. mapKeys Reference. toText typeDefinitions
135+ renderedMisses = fmap HQ. toText misses
136+ pure $
137+ DefinitionDisplayResults
138+ renderedDisplayTerms
139+ renderedDisplayTypes
140+ renderedMisses
127141
128142renderDocRefs ::
129143 PPEDBuilder (Codebase. CodebaseM e ) ->
0 commit comments