Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Drop-down widgets for extension functions via UnresolvedSymbol #7115

Merged
merged 32 commits into from
Jun 27, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
a097109
Specify visualisation_module when attaching a visualisation
JaroslavTulach Jun 23, 2023
d33c42c
Accept UnresolvedSymbol as a parameter to Meta.get_annotation
JaroslavTulach Jun 23, 2023
ff4af7d
Provide visualisationModule in tests
JaroslavTulach Jun 23, 2023
673c49e
Adjust tests to new parameter of Api.VisualisationConfiguration
JaroslavTulach Jun 23, 2023
ebcb98c
Formatting can compilation fixes
JaroslavTulach Jun 23, 2023
ad953f4
Proper visualisationModule name
JaroslavTulach Jun 24, 2023
47733ff
Merge remote-tracking branch 'origin/develop' into wip/jtulach/Unreso…
JaroslavTulach Jun 24, 2023
ef9ee73
Adding missing EOL at EOF
JaroslavTulach Jun 24, 2023
83b7d45
Generate visualisationModule attribute
JaroslavTulach Jun 24, 2023
06226b7
result of javafmtAll
JaroslavTulach Jun 24, 2023
09254d3
Check request and response includes visualisationModule
JaroslavTulach Jun 26, 2023
236c612
Few more visualisation modules specified in tests
JaroslavTulach Jun 26, 2023
15b9639
cargo in root of the repository compiles
JaroslavTulach Jun 26, 2023
6982bb1
Another test to fix
JaroslavTulach Jun 26, 2023
4274080
Suggestions by Adam
JaroslavTulach Jun 26, 2023
1223fba
Adjusting description to one used in execution_context
JaroslavTulach Jun 26, 2023
8f60565
Use QualifiedName for identification of modules
JaroslavTulach Jun 26, 2023
3ffb6e3
Use format macro to format arg
JaroslavTulach Jun 26, 2023
429001e
Making project field non-pub again
JaroslavTulach Jun 26, 2023
d966407
Use qualified name in the test
JaroslavTulach Jun 26, 2023
b2076bc
Fixing the tests to use QualifiedName as a module
JaroslavTulach Jun 27, 2023
3e031bb
Merging to accommodate visualization rename
JaroslavTulach Jun 27, 2023
58f5d6c
scalafmtAll
JaroslavTulach Jun 27, 2023
6365b25
More of visualizationModule usages
JaroslavTulach Jun 27, 2023
b0a86fb
Need module.to_string_with_main_segment
JaroslavTulach Jun 27, 2023
1042ac9
Documenting the new method parameters
JaroslavTulach Jun 27, 2023
7b27188
visualizationModule is compulsory parameter
JaroslavTulach Jun 27, 2023
8806646
Typo in executed.rs
JaroslavTulach Jun 27, 2023
883b17d
Require Unresolved_Symbol as identification of a method in get_annota…
JaroslavTulach Jun 27, 2023
eba65de
Module to be used to evaluate the arguments
JaroslavTulach Jun 27, 2023
38c486e
Evaluate expression in expressionModule
JaroslavTulach Jun 27, 2023
83b0057
Just call it: method
JaroslavTulach Jun 27, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -434,6 +434,7 @@ fn test_execution_context() {
};
let positional_arguments_expressions = vec![1, 2, 3].iter().map(|x| x.to_string()).collect();
let visualization_config = VisualizationConfiguration {
visualization_module: "Foo.Bar.Baz".to_string(),
execution_context_id: context_id,
expression,
positional_arguments_expressions,
Expand All @@ -453,6 +454,7 @@ fn test_execution_context() {
"definedOnType" : "[Foo.Bar.Baz]",
"name" : "foo"
},
"visualizationModule" : "Foo.Bar.Baz",
"positionalArgumentsExpressions" : ["1", "2", "3"]
}
}),
Expand All @@ -479,6 +481,7 @@ fn test_execution_context() {
};
let positional_arguments_expressions = vec!["foo"].iter().map(|x| x.to_string()).collect();
let visualization_config = VisualizationConfiguration {
visualization_module: "Foo.Bar.Baz".to_string(),
execution_context_id: context_id,
expression,
positional_arguments_expressions,
Expand All @@ -495,6 +498,7 @@ fn test_execution_context() {
"definedOnType" : "[Foo.Bar.Baz]",
"name" : "foo"
},
"visualizationModule" : "Foo.Bar.Baz",
"positionalArgumentsExpressions" : ["foo"]
}
}),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -713,6 +713,8 @@ pub type ExpressionId = Uuid;
#[serde(rename_all = "camelCase")]
#[allow(missing_docs)]
pub struct VisualizationConfiguration {
/// Module to evaluate visualization in context of.
pub visualization_module: String,
/// An execution context of the visualization.
pub execution_context_id: ContextId,
/// An enso function that will transform the data into expected format.
Expand Down
13 changes: 11 additions & 2 deletions app/gui/src/controller/graph/executed.rs
Original file line number Diff line number Diff line change
Expand Up @@ -403,12 +403,21 @@ impl Handle {
}


/// Get a full qualified name of the module in the [`graph`]. The name is obtained from the
/// Get a fully qualified name of the module in the [`graph`]. The name is obtained from the
/// module's path and the `project` name.
pub fn module_qualified_name(&self, project: &dyn model::project::API) -> QualifiedName {
pub fn module_qualified_name_with_project(
&self,
project: &dyn model::project::API,
) -> QualifiedName {
self.graph().module.path().qualified_module_name(project.qualified_name())
}

/// Get a full qualified name of the module in the [`graph`]. The name is obtained from the
JaroslavTulach marked this conversation as resolved.
Show resolved Hide resolved
/// module's path and the `project` name.
pub fn module_qualified_name(&self) -> QualifiedName {
self.graph().module.path().qualified_module_name(self.project.qualified_name())
}

/// Returns information about all the connections between graph's nodes.
///
/// In contrast with the `controller::Graph::connections` this uses information received from
Expand Down
8 changes: 7 additions & 1 deletion app/gui/src/controller/graph/widget.rs
Original file line number Diff line number Diff line change
Expand Up @@ -392,7 +392,7 @@ impl QueryData {
/// Generate visualization metadata for this query.
fn visualization_metadata(&self) -> Metadata {
let arguments: Vec<Code> = vec![
Self::escape_visualization_argument(&self.method_name).into(),
Self::as_unresolved_symbol(&self.method_name).into(),
Self::arg_sequence(&self.arguments).into(),
];

Expand All @@ -410,6 +410,12 @@ impl QueryData {
Ast::raw_text_literal(arg).repr()
}

/// Creates unresolved symbol via ".name" syntax. Unresolved symbol contains name and also
/// module scope to resolve it properly.
fn as_unresolved_symbol(arg: &str) -> String {
format!(".{arg}")
}

/// Escape a list of strings to be used as a visualization argument. Transforms the strings into
/// an enso expression with a list of string literals.
fn arg_sequence(args: &[ImString]) -> String {
Expand Down
4 changes: 2 additions & 2 deletions app/gui/src/controller/searcher.rs
Original file line number Diff line number Diff line change
Expand Up @@ -574,7 +574,7 @@ impl Searcher {
"Standard.Visualization.AI",
"build_ai_prompt",
)?;
let vis = Visualization::new(this.id, vis_ptr, vec![]);
let vis = Visualization::new(vis_ptr.module.to_owned(), this.id, vis_ptr, vec![]);
let mut result = graph.attach_visualization(vis.clone()).await?;
let next = result.next().await.ok_or(NoAIVisualizationDataReceived)?;
let prompt = std::str::from_utf8(&next)?;
Expand Down Expand Up @@ -1091,7 +1091,7 @@ impl Searcher {
}

fn module_qualified_name(&self) -> QualifiedName {
self.graph.module_qualified_name(&*self.project)
self.graph.module_qualified_name_with_project(&*self.project)
}

fn filter(&self) -> Filter {
Expand Down
15 changes: 12 additions & 3 deletions app/gui/src/controller/visualization/manager.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ use crate::model::execution_context::VisualizationId;
use crate::model::execution_context::VisualizationUpdateData;
use crate::sync::Synchronized;

use double_representation::name::QualifiedName;
use futures::channel::mpsc::UnboundedReceiver;
use futures::future::ready;
use ide_view::graph_editor::component::visualization::Metadata;
Expand Down Expand Up @@ -158,6 +159,7 @@ impl Default for Status {
#[allow(missing_docs)]
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Desired {
pub module: QualifiedName,
pub visualization_id: VisualizationId,
pub expression_id: ast::Id,
pub metadata: Metadata,
Expand Down Expand Up @@ -285,11 +287,15 @@ impl Manager {
// Early return: requested to remove visualization that was already removed.
return;
};
let prj = self.executed_graph.module_qualified_name();
let graph = self.executed_graph.graph();
let module = prj.new_child(graph.module.name());
let current_id = current.as_ref().and_then(|current| current.latest_id());
let new_desired = new_desired.map(|new_desired| Desired {
expression_id: target,
module,
expression_id: target,
visualization_id: current_id.unwrap_or_else(VisualizationId::new_v4),
metadata: new_desired,
metadata: new_desired,
});
self.write_new_desired(target, new_desired)
}
Expand Down Expand Up @@ -332,6 +338,7 @@ impl Manager {
Ok(Visualization {
id: desired.visualization_id,
expression_id: desired.expression_id,
module: desired.module,
method_pointer,
arguments,
})
Expand Down Expand Up @@ -556,13 +563,14 @@ mod tests {
let qualified_module = inner.project.qualified_module_name(inner.module.path());
let method_pointer = QualifiedMethodPointer {
module: qualified_module.clone(),
defined_on_type: qualified_module,
defined_on_type: qualified_module.clone(),
name: Identifier::from_text("faux").unwrap(),
};
let arguments = vec!["foo".to_owned()];
let faux_vis = Visualization {
id: default(),
expression_id: default(),
module: qualified_module,
method_pointer,
arguments,
};
Expand Down Expand Up @@ -666,6 +674,7 @@ mod tests {
// We don't attach it separately, as Manager identifies visualizations by their
// expression ID rather than visualization ID.
let desired_vis_3 = Desired {
module: QualifiedName::from_text("local.Widgets.Main").unwrap(),
visualization_id: VisualizationId::from_u128(900),
expression_id: node_id,
metadata: desired_vis_1,
Expand Down
6 changes: 5 additions & 1 deletion app/gui/src/model/execution_context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -323,6 +323,8 @@ pub struct Visualization {
pub id: VisualizationId,
/// Expression that is to be visualized.
pub expression_id: ExpressionId,
/// Module to evaluate visualization in context of.
pub module: QualifiedName,
/// A pointer to the enso method that will transform the data into expected format.
pub method_pointer: QualifiedMethodPointer,
/// Enso expressions for positional arguments
Expand All @@ -333,19 +335,21 @@ impl Visualization {
/// Creates a new visualization description. The visualization will get a randomly assigned
/// identifier.
pub fn new(
module: QualifiedName,
expression_id: ExpressionId,
method_pointer: QualifiedMethodPointer,
arguments: Vec<String>,
) -> Visualization {
let id = VisualizationId::new_v4();
Visualization { id, expression_id, method_pointer, arguments }
Visualization { id, expression_id, module, method_pointer, arguments }
}

/// Creates a `VisualizationConfiguration` that is used in communication with language server.
pub fn config(&self, execution_context_id: Uuid) -> VisualizationConfiguration {
let expression = self.method_pointer.clone().into();
let positional_arguments_expressions = self.arguments.clone();
VisualizationConfiguration {
visualization_module: self.module.to_string_with_main_segment(),
execution_context_id,
expression,
positional_arguments_expressions,
Expand Down
4 changes: 4 additions & 0 deletions app/gui/src/model/execution_context/synchronized.rs
Original file line number Diff line number Diff line change
Expand Up @@ -532,6 +532,7 @@ pub mod test {
let arguments = vec![];
let vis = Visualization {
id: model::execution_context::VisualizationId::new_v4(),
module: method_pointer.module.clone(),
expression_id: model::execution_context::ExpressionId::new_v4(),
method_pointer,
arguments,
Expand Down Expand Up @@ -581,6 +582,7 @@ pub mod test {
let arguments = vec!["foo".to_owned()];
let vis = Visualization {
id: model::execution_context::VisualizationId::new_v4(),
module: method_pointer.module.clone(),
expression_id: model::execution_context::ExpressionId::new_v4(),
method_pointer,
arguments,
Expand Down Expand Up @@ -618,6 +620,7 @@ pub mod test {
let arguments = vec!["bar".to_owned()];
let vis = Visualization {
id: model::execution_context::VisualizationId::new_v4(),
module: method_pointer.module.clone(),
expression_id: model::execution_context::ExpressionId::new_v4(),
method_pointer,
arguments: arguments.clone(),
Expand All @@ -634,6 +637,7 @@ pub mod test {

let expected_config = language_server::types::VisualizationConfiguration {
execution_context_id: data.context_id,
visualization_module: MockData::new().module_qualified_name().to_string(),
expression: new_expression.clone().into(),
positional_arguments_expressions: arguments.clone(),
};
Expand Down
5 changes: 4 additions & 1 deletion app/gui/tests/language_server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@ async fn ls_text_protocol_test() {
execution_context_id,
expression,
positional_arguments_expressions,
visualization_module: visualization_module.to_string(),
};
let response =
client.attach_visualization(&visualization_id, &expression_id, &visualization_config);
Expand All @@ -157,6 +158,7 @@ async fn ls_text_protocol_test() {
execution_context_id,
expression,
positional_arguments_expressions,
visualization_module: visualization_module.to_string(),
};
let response = client.modify_visualization(&visualization_id, &visualization_config).await;
response.expect("Couldn't modify visualization.");
Expand Down Expand Up @@ -375,7 +377,8 @@ async fn binary_visualization_updates_test_hlp() {
module_qualified_name,
Identifier::from_text("quux").unwrap(),
);
let visualization = Visualization::new(the_node.id(), method_pointer, vec![]);
let visualization =
Visualization::new(method_pointer.module.clone(), the_node.id(), method_pointer, vec![]);
let stream = graph_executed.attach_visualization(visualization.clone()).await.unwrap();
info!("Attached the visualization {}", visualization.id);
let mut stream = stream.boxed_local();
Expand Down
6 changes: 3 additions & 3 deletions distribution/lib/Standard/Base/0.0.0-dev/src/Meta.enso
Original file line number Diff line number Diff line change
Expand Up @@ -419,10 +419,10 @@ type_of value = @Builtin_Method "Meta.type_of"

Arguments:
- target: The value or type to get the attribute from.
- method_name: The name of the method or constructor to get the attribute for.
- method: The symbol representing method or constructor to get the attribute for.
- parameter_name: The name of the parameter to get the attribute for.
get_annotation : Any -> Text -> Text -> Any | Nothing
get_annotation target method_name parameter_name = @Builtin_Method "Meta.get_annotation"
get_annotation : Any -> Any -> Text -> Any | Nothing
radeusgd marked this conversation as resolved.
Show resolved Hide resolved
get_annotation target method parameter_name = @Builtin_Method "Meta.get_annotation"

## PRIVATE
Represents a polyglot language.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ from Standard.Base import all
Basic preprocessor for widgets metadata visualization.

Returns full annotation data for all requested arguments.
get_widget_json : Any -> Text -> Vector Text -> Text
get_widget_json : Any -> Any -> Vector Text -> Text
get_widget_json value call_name argument_names =
read_annotation argument =
annotation = Warning.clear <| Meta.get_annotation value call_name argument
Expand Down
5 changes: 2 additions & 3 deletions docs/language-server/protocol-language-server.md
Original file line number Diff line number Diff line change
Expand Up @@ -453,10 +453,9 @@ interface VisualizationConfiguration {
executionContextId: UUID;

/**
* A qualified name of the module containing the expression which creates
* visualization.
* A qualified name of the module to be used to evaluate the arguments for the visualization expression.
*/
visualizationModule?: String;
visualizationModule: String;

/** An expression that creates a visualization. */
expression: String | MethodPointer;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,16 @@ import java.util.UUID
*
* @param executionContextId an execution context of the visualization
* @param expression an expression that creates a visualization
* @param visualizationModule the name of a module to execute expression at
* @param executionContextId an execution context of the visualization
* @param expression an expression that creates a visualization
*/
case class VisualizationConfiguration(
executionContextId: UUID,
expression: VisualizationExpression
expression: VisualizationExpression,
visualizationModule: String
) extends ToLogString {

/** A qualified module name containing the expression. */
def visualizationModule: String =
expression.module

/** @inheritdoc */
override def toLogString(shouldMask: Boolean): String =
s"VisualizationConfiguration(" +
Expand All @@ -31,8 +31,9 @@ case class VisualizationConfiguration(
/** Convert to corresponding [[Api]] message. */
def toApi: Api.VisualizationConfiguration =
Api.VisualizationConfiguration(
executionContextId = executionContextId,
expression = expression.toApi
executionContextId = executionContextId,
expression = expression.toApi,
visualizationModule = visualizationModule
)

}
Expand All @@ -52,7 +53,8 @@ object VisualizationConfiguration {
): VisualizationConfiguration =
new VisualizationConfiguration(
contextId,
VisualizationExpression.Text(module, expression)
VisualizationExpression.Text(module, expression),
module
)

/** Create a visualization configuration.
Expand All @@ -65,6 +67,7 @@ object VisualizationConfiguration {
*/
def apply(
contextId: UUID,
module: String,
expression: MethodPointer,
positionalArgumentsExpressions: Vector[String]
): VisualizationConfiguration =
Expand All @@ -73,7 +76,8 @@ object VisualizationConfiguration {
VisualizationExpression.ModuleMethod(
expression,
positionalArgumentsExpressions
)
),
module
)

private object CodecField {
Expand All @@ -99,11 +103,15 @@ object VisualizationConfiguration {
expression <- cursor
.downField(CodecField.Expression)
.as[MethodPointer]
visualizationModule <- cursor
.downField(CodecField.VisualizationModule)
.as[String]
JaroslavTulach marked this conversation as resolved.
Show resolved Hide resolved
arguments <- cursor
.downField(CodecField.Arguments)
.as[Option[Vector[String]]]
} yield VisualizationConfiguration(
contextId,
visualizationModule,
expression,
arguments.getOrElse(Vector())
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,7 @@ object ExecutionContextJsonMessages {
"expressionId": $expressionId,
"visualizationConfig": {
"executionContextId": ${configuration.executionContextId},
"visualizationModule": ${configuration.visualizationModule},
"expression": {
"module": ${methodPointer.module},
"definedOnType": ${methodPointer.definedOnType},
Expand All @@ -223,6 +224,7 @@ object ExecutionContextJsonMessages {
"expressionId": $expressionId,
"visualizationConfig": {
"executionContextId": ${configuration.executionContextId},
"visualizationModule": ${methodPointer.module},
"expression": {
"module": ${methodPointer.module},
"definedOnType": ${methodPointer.definedOnType},
Expand Down
Loading
Loading