Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
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
8 changes: 4 additions & 4 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -791,7 +791,7 @@
"watch-web": "webpack --watch"
},
"dependencies": {
"@eagleoutice/flowr": "^2.10.6",
"@eagleoutice/flowr": "^2.10.7",
"assert": "^2.1.0",
"browserify-zlib": "^0.2.0",
"constants-browserify": "^1.0.0",
Expand Down Expand Up @@ -834,4 +834,4 @@
"tsdoc/syntax": "off"
}
}
}
}
41 changes: 24 additions & 17 deletions src/flowr/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import type { CfgSimplificationPassName } from '@eagleoutice/flowr/control-flow/
import { RType } from '@eagleoutice/flowr/r-bridge/lang-4.x/ast/model/type';
import type { RExpressionList } from '@eagleoutice/flowr/r-bridge/lang-4.x/ast/model/nodes/r-expression-list';
import type { SliceDirection } from '@eagleoutice/flowr/util/slice-direction';
import { Q } from '@eagleoutice/flowr/search/flowr-search-builder';

// Contains utility functions and a common interface for the two FlowrSession implementations

Expand All @@ -38,6 +39,24 @@ export interface FlowrSession {
runRepl: (output: Omit<FlowrReplOptions, 'parser'>) => Promise<void>
}

/**
*
*/
export async function getNodeIdAt(position: vscode.Position, document: vscode.TextDocument, session: FlowrSession): Promise<NodeId | undefined> {
const result = await session.retrieveQuery(document, [{
type: 'search',
search: Q.locFuzzy(position.line + 1, position.character + 1, true).build()
}]);

if(result.hasError) {
return undefined;
}

const id = result.result.search.results[0].ids[0];
console.log(`Found nodeid=${id} at (${position.line}, ${position.character})`);
return id;
}

/**
*
*/
Expand All @@ -54,27 +73,15 @@ export function consolidateNewlines(text: string) {
return text.replace(/\r\n/g, '\n');
}

function toSlicingCriterion(pos: vscode.Position): SlicingCriterion {
return `${pos.line + 1}:${pos.character + 1}`;
}

export function makeSlicingCriteria(positions: [vscode.Position], doc: vscode.TextDocument, verbose?: boolean): [SlicingCriterion];
export function makeSlicingCriteria(positions: vscode.Position[], doc: vscode.TextDocument, verbose?: boolean): SlicingCriteria;
export async function makeSlicingCriteriaForPositions(positions: [vscode.Position], doc: vscode.TextDocument, session: FlowrSession): Promise<[SlicingCriterion]>;
export async function makeSlicingCriteriaForPositions(positions: vscode.Position[], doc: vscode.TextDocument, session: FlowrSession): Promise<SlicingCriteria>;
/**
*
*/
export function makeSlicingCriteria(positions: vscode.Position[], doc: vscode.TextDocument, verbose: boolean = true): SlicingCriteria {
positions = positions.map(pos => {
const range = getPositionAt(pos, doc);
pos = range?.start ?? pos;
if(verbose){
console.log(`Extracting slice at ${pos.line + 1}:${pos.character + 1} in ${doc.fileName}`);
console.log(`Token: ${doc.getText(range)}`);
}
return pos;
});
const criteria = positions.map(toSlicingCriterion);
return criteria;
export async function makeSlicingCriteriaForPositions(positions: vscode.Position[], doc: vscode.TextDocument, session: FlowrSession): Promise<SlicingCriteria> {
const ids = await Promise.all(positions.map(pos => getNodeIdAt(pos, doc, session)));
return ids.map(id => `$${id}` as SlicingCriterion);
}

/**
Expand Down
4 changes: 2 additions & 2 deletions src/hover-values.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import * as vscode from 'vscode';
import type { NodeId } from '@eagleoutice/flowr/r-bridge/lang-4.x/ast/model/processing/node-id';
import { getFlowrSession } from './extension';
import { makeSlicingCriteria } from './flowr/utils';
import { makeSlicingCriteriaForPositions } from './flowr/utils';
import { Bottom, Top } from '@eagleoutice/flowr/abstract-interpretation/domains/lattice';
import { isTop, stringifyValue } from '@eagleoutice/flowr/dataflow/eval/values/r-value';
import { getConfig, Settings } from './settings';
Expand Down Expand Up @@ -81,7 +81,7 @@ class FlowrHoverProvider implements vscode.HoverProvider {

this.output.appendLine(`[Hover Values] Resolving value at ${document.uri.toString()}:${pos.line + 1}:${pos.character + 1}`);

const [criteria] = makeSlicingCriteria([pos], document);
const [criteria] = await makeSlicingCriteriaForPositions([pos], document, session);
const cached = this.cache.get(criteria);
if(cached) {
this.output.appendLine(` [Hover Values] Using cached value for ${document.uri.toString()}:${pos.line + 1}:${pos.character + 1} (${JSON.stringify(cached.map(c => c.value), builtInEnvJsonReplacer)})`);
Expand Down
8 changes: 4 additions & 4 deletions src/position-slicer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@
import * as vscode from 'vscode';
import { getFlowrSession, updateStatusBar } from './extension';
import { makeUri, getReconstructionContentProvider, showUri } from './doc-provider';
import { getPositionAt, makeSlicingCriteria } from './flowr/utils';
import { getPositionAt, makeSlicingCriteriaForPositions } from './flowr/utils';
import type { DecoTypes } from './slice';
import { displaySlice, makeSliceDecorationTypes } from './slice';
import { getSelectionSlicer } from './selection-slicer';
import type { SliceDisplay } from './settings';
import { Settings, getConfig, isVerbose } from './settings';
import { Settings, getConfig } from './settings';
import type { NodeId } from '@eagleoutice/flowr/r-bridge/lang-4.x/ast/model/processing/node-id';
import type { SourceRange } from '@eagleoutice/flowr/util/range';
import { SliceDirection } from '@eagleoutice/flowr/util/slice-direction';
Expand Down Expand Up @@ -269,12 +269,12 @@ export class PositionSlicer {
const positions = this.positions.map(p => ({ direction: p.direction, docPos: this.doc.positionAt(p.offset) }));
const { backward, forward } = Object.groupBy(positions, p => p.direction.toString());
if(backward && backward.length > 0) {
const results = await session.retrieveSlice(makeSlicingCriteria(backward.map(p => p.docPos), this.doc, isVerbose()), SliceDirection.Backward, this.doc, this.showErrors);
const results = await session.retrieveSlice(await makeSlicingCriteriaForPositions(backward.map(p => p.docPos), this.doc, session), SliceDirection.Backward, this.doc, this.showErrors);
code = results.code;
sliceElements.push(...results.sliceElements);
}
if(forward && forward.length > 0) {
const results = await session.retrieveSlice(makeSlicingCriteria(forward.map(p => p.docPos), this.doc, isVerbose()), SliceDirection.Forward, this.doc, this.showErrors);
const results = await session.retrieveSlice(await makeSlicingCriteriaForPositions(forward.map(p => p.docPos), this.doc, session), SliceDirection.Forward, this.doc, this.showErrors);
sliceElements.push(...results.sliceElements);
// we don't return code if we have at least one forward slice in our list, because forward slices don't ensure executability!
code = undefined;
Expand Down
6 changes: 3 additions & 3 deletions src/selection-slicer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@
import * as vscode from 'vscode';
import { getFlowrSession, updateStatusBar } from './extension';
import { flowrScheme, makeUri, getReconstructionContentProvider, showUri } from './doc-provider';
import { makeSlicingCriteria, type SliceReturn } from './flowr/utils';
import { makeSlicingCriteriaForPositions, type SliceReturn } from './flowr/utils';
import type { DecoTypes } from './slice';
import { displaySlice, makeSliceDecorationTypes } from './slice';
import { positionSlicers } from './position-slicer';
import { Settings, getConfig, isVerbose } from './settings';
import { Settings, getConfig } from './settings';
import { getCriteriaSlicer } from './criteria-slicer';
import { isRTypeLanguage } from './configurable-refresher';
import { SliceDirection } from '@eagleoutice/flowr/util/slice-direction';
Expand Down Expand Up @@ -178,7 +178,7 @@ async function getSelectionSlice(direction: SliceDirection): Promise<SelectionSl
return undefined;
}
const flowrSession = await getFlowrSession();
const ret = await flowrSession.retrieveSlice(makeSlicingCriteria(positions, editor.document, isVerbose()), direction, editor.document, false);
const ret = await flowrSession.retrieveSlice(await makeSlicingCriteriaForPositions(positions, editor.document, flowrSession), direction, editor.document, false);
if(!ret.sliceElements.length){
return {
code: '# No slice',
Expand Down
Loading