Skip to content
Merged
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
6 changes: 3 additions & 3 deletions src/abstract-interpretation/data-frame/absint-visitor.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import { type CfgBasicBlockVertex, type CfgSimpleVertex, type ControlFlowInformation , CfgVertexType, getVertexRootId, isMarkerVertex } from '../../control-flow/control-flow-graph';
import { type SemanticCfgGuidedVisitorConfiguration , SemanticCfgGuidedVisitor } from '../../control-flow/semantic-cfg-guided-visitor';
import { type CfgBasicBlockVertex, type CfgSimpleVertex, type ControlFlowInformation, CfgVertexType, getVertexRootId, isMarkerVertex } from '../../control-flow/control-flow-graph';
import { type SemanticCfgGuidedVisitorConfiguration, SemanticCfgGuidedVisitor } from '../../control-flow/semantic-cfg-guided-visitor';
import type { DataflowGraph } from '../../dataflow/graph/graph';
import type { DataflowGraphVertexFunctionCall, DataflowGraphVertexVariableDefinition } from '../../dataflow/graph/vertex';
import type { NoInfo, RNode } from '../../r-bridge/lang-4.x/ast/model/model';
import type { NormalizedAst, ParentInformation } from '../../r-bridge/lang-4.x/ast/model/processing/decorate';
import type { NodeId } from '../../r-bridge/lang-4.x/ast/model/processing/node-id';
import { isNotUndefined } from '../../util/assert';
import { DataFrameInfoMarker, hasDataFrameAssignmentInfo, hasDataFrameExpressionInfo, hasDataFrameInfoMarker, type AbstractInterpretationInfo } from './absint-info';
import { type AbstractInterpretationInfo, DataFrameInfoMarker, hasDataFrameAssignmentInfo, hasDataFrameExpressionInfo, hasDataFrameInfoMarker } from './absint-info';
import { DataFrameDomain, DataFrameStateDomain } from './dataframe-domain';
import { mapDataFrameAccess } from './mappers/access-mapper';
import { isAssignmentTarget, mapDataFrameVariableAssignment } from './mappers/assignment-mapper';
Expand Down
22 changes: 8 additions & 14 deletions src/abstract-interpretation/data-frame/dataframe-domain.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,13 @@ import type { NodeId } from '../../r-bridge/lang-4.x/ast/model/processing/node-i
import type { AbstractDomainValue } from '../domains/abstract-domain';
import { PosIntervalDomain } from '../domains/positive-interval-domain';
import { ProductDomain } from '../domains/product-domain';
import { SetUpperBoundDomain } from '../domains/set-upper-bound-domain';
import type { SetRangeLimit } from '../domains/set-range-domain';
import { SetRangeDomain } from '../domains/set-range-domain';
import { StateAbstractDomain } from '../domains/state-abstract-domain';

/** The type of the abstract product representing the shape of data frames */
export type AbstractDataFrameShape = {
colnames: SetUpperBoundDomain<string>;
colnames: SetRangeDomain<string>;
cols: PosIntervalDomain;
rows: PosIntervalDomain;
}
Expand All @@ -19,17 +20,17 @@ export type DataFrameShapeProperty<Property extends keyof AbstractDataFrameShape
* The data frame abstract domain as product domain of a column names domain, column count domain, and row count domain.
*/
export class DataFrameDomain extends ProductDomain<AbstractDataFrameShape> {
constructor(value: AbstractDataFrameShape, maxColNames?: number) {
constructor(value: AbstractDataFrameShape, maxColNames?: SetRangeLimit | number) {
super({
colnames: new SetUpperBoundDomain(value.colnames.value, maxColNames ?? value.colnames.limit),
colnames: new SetRangeDomain(value.colnames.value, maxColNames ?? value.colnames.limit),
cols: new PosIntervalDomain(value.cols.value),
rows: new PosIntervalDomain(value.rows.value)
});
}

public create(value: AbstractDataFrameShape): this;
public create(value: AbstractDataFrameShape): DataFrameDomain {
return new DataFrameDomain(value, this.maxColNames);
return new DataFrameDomain(value, this.colnames.limit);
}

/**
Expand All @@ -53,24 +54,17 @@ export class DataFrameDomain extends ProductDomain<AbstractDataFrameShape> {
return this.value.rows;
}

/**
* The maximum number of inferred column names of the column names domain.
*/
public get maxColNames(): number {
return this.value.colnames.limit;
}

public static bottom(maxColNames?: number): DataFrameDomain {
return new DataFrameDomain({
colnames: SetUpperBoundDomain.bottom(maxColNames),
colnames: SetRangeDomain.bottom(maxColNames),
cols: PosIntervalDomain.bottom(),
rows: PosIntervalDomain.bottom()
});
}

public static top(maxColNames?: number): DataFrameDomain {
return new DataFrameDomain({
colnames: SetUpperBoundDomain.top(maxColNames),
colnames: SetRangeDomain.top(maxColNames),
cols: PosIntervalDomain.top(),
rows: PosIntervalDomain.top()
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import type { ResolveInfo } from '../../../dataflow/eval/resolve/alias-tracking'
import type { DataflowGraph } from '../../../dataflow/graph/graph';
import type { RNode } from '../../../r-bridge/lang-4.x/ast/model/model';
import type { RAccess, RIndexAccess, RNamedAccess } from '../../../r-bridge/lang-4.x/ast/model/nodes/r-access';
import { type RFunctionArgument , EmptyArgument } from '../../../r-bridge/lang-4.x/ast/model/nodes/r-function-call';
import { type RFunctionArgument, EmptyArgument } from '../../../r-bridge/lang-4.x/ast/model/nodes/r-function-call';
import type { ParentInformation } from '../../../r-bridge/lang-4.x/ast/model/processing/decorate';
import { RType } from '../../../r-bridge/lang-4.x/ast/model/type';
import type { DataFrameExpressionInfo, DataFrameOperation } from '../absint-info';
Expand Down
6 changes: 3 additions & 3 deletions src/abstract-interpretation/data-frame/mappers/arguments.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@ import { isUseVertex, VertexType } from '../../../dataflow/graph/vertex';
import { toUnnamedArgument } from '../../../dataflow/internal/process/functions/call/argument/make-argument';
import type { RNode } from '../../../r-bridge/lang-4.x/ast/model/model';
import type { RArgument } from '../../../r-bridge/lang-4.x/ast/model/nodes/r-argument';
import { type RFunctionArgument, type RFunctionCall , EmptyArgument } from '../../../r-bridge/lang-4.x/ast/model/nodes/r-function-call';
import { type RFunctionArgument, type RFunctionCall, EmptyArgument } from '../../../r-bridge/lang-4.x/ast/model/nodes/r-function-call';
import type { RSymbol } from '../../../r-bridge/lang-4.x/ast/model/nodes/r-symbol';
import type { ParentInformation } from '../../../r-bridge/lang-4.x/ast/model/processing/decorate';
import { visitAst } from '../../../r-bridge/lang-4.x/ast/model/processing/visitor';
import { RType } from '../../../r-bridge/lang-4.x/ast/model/type';
import { RNull } from '../../../r-bridge/lang-4.x/convert-values';
import type { AbstractInterpretationInfo } from '../absint-info';
import { resolveIdToDataFrameShape } from '../shape-inference';
import { resolveIdToArgName, resolveIdToArgValue, unquoteArgument } from '../resolve-args';
import { visitAst } from '../../../r-bridge/lang-4.x/ast/model/processing/visitor';
import { resolveIdToDataFrameShape } from '../shape-inference';

/** Regular expression representing valid columns names, e.g. for `data.frame` */
const ColNamesRegex = /^[A-Za-z.][A-Za-z0-9_.]*$/;
Expand Down
27 changes: 14 additions & 13 deletions src/abstract-interpretation/data-frame/mappers/function-mapper.ts
Original file line number Diff line number Diff line change
@@ -1,22 +1,22 @@
import { VariableResolve } from '../../../config';
import { VariableResolve } from '../../../config';
import { type ResolveInfo } from '../../../dataflow/eval/resolve/alias-tracking';
import type { DataflowGraph } from '../../../dataflow/graph/graph';
import { toUnnamedArgument } from '../../../dataflow/internal/process/functions/call/argument/make-argument';
import { findSource } from '../../../dataflow/internal/process/functions/call/built-in/built-in-source';
import type { ReadOnlyFlowrAnalyzerContext } from '../../../project/context/flowr-analyzer-context';
import type { RNode } from '../../../r-bridge/lang-4.x/ast/model/model';
import { type RFunctionArgument , EmptyArgument } from '../../../r-bridge/lang-4.x/ast/model/nodes/r-function-call';
import { type RFunctionArgument, EmptyArgument } from '../../../r-bridge/lang-4.x/ast/model/nodes/r-function-call';
import type { ParentInformation } from '../../../r-bridge/lang-4.x/ast/model/processing/decorate';
import { RType } from '../../../r-bridge/lang-4.x/ast/model/type';
import { type RParseRequest , requestFromInput } from '../../../r-bridge/retriever';
import { type RParseRequest, requestFromInput } from '../../../r-bridge/retriever';
import { assertUnreachable, isNotUndefined, isUndefined } from '../../../util/assert';
import { readLineByLineSync } from '../../../util/files';
import type { DataFrameExpressionInfo, DataFrameOperation } from '../absint-info';
import { DataFrameDomain } from '../dataframe-domain';
import { resolveIdToArgName, resolveIdToArgValue, resolveIdToArgValueSymbolName, resolveIdToArgVectorLength, unescapeSpecialChars } from '../resolve-args';
import type { ConstraintType } from '../semantics';
import { resolveIdToDataFrameShape } from '../shape-inference';
import { type FunctionParameterLocation , escapeRegExp, filterValidNames, getArgumentValue, getEffectiveArgs, getFunctionArgument, getFunctionArguments, getUnresolvedSymbolsInExpression, hasCriticalArgument, isDataFrameArgument, isNamedArgument, isRNull } from './arguments';
import type { ReadOnlyFlowrAnalyzerContext } from '../../../project/context/flowr-analyzer-context';
import { type FunctionParameterLocation, escapeRegExp, filterValidNames, getArgumentValue, getEffectiveArgs, getFunctionArgument, getFunctionArguments, getUnresolvedSymbolsInExpression, hasCriticalArgument, isDataFrameArgument, isNamedArgument, isRNull } from './arguments';

/**
* Represents the different types of data frames in R
Expand Down Expand Up @@ -564,7 +564,7 @@ type OtherDataFrameFunctionMapping = OtherDataFrameEntryPoint | OtherDataFrameTr
* - `args` contains the function call arguments
* - `params` contains the expected argument location for each parameter of the function
* - `info` contains the resolve information
* - `ctx` access to the current flowR analyzer context
* - `ctx` contains the current flowR analyzer context
*/
type DataFrameFunctionMapping<Params extends object> = (
args: readonly RFunctionArgument<ParentInformation>[],
Expand Down Expand Up @@ -1127,20 +1127,20 @@ function mapDataFrameMutate(
});
}

if(deletedCols === undefined || deletedCols.length > 0) {
if(mutatedCols === undefined || mutatedCols.length > 0 || deletedCols?.length === 0) {
result.push({
operation: 'removeCols',
operation: 'mutateCols',
operand: operand?.info.id,
colnames: deletedCols,
options: { maybe: true }
colnames: mutatedCols
});
operand = undefined;
}
if(mutatedCols === undefined || mutatedCols.length > 0 || deletedCols?.length === 0) {
if(deletedCols === undefined || deletedCols.length > 0) {
result.push({
operation: 'mutateCols',
operation: 'removeCols',
operand: operand?.info.id,
colnames: mutatedCols
colnames: deletedCols,
options: { maybe: true }
});
operand = undefined;
}
Expand Down Expand Up @@ -1381,6 +1381,7 @@ function getRequestFromRead(
}
}
request = request ? ctx.files.resolveRequest(request).r : undefined;

return { source, request };
}

Expand Down
2 changes: 1 addition & 1 deletion src/abstract-interpretation/data-frame/resolve-args.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { type ResolveInfo , resolveIdToValue } from '../../dataflow/eval/resolve/alias-tracking';
import { type ResolveInfo, resolveIdToValue } from '../../dataflow/eval/resolve/alias-tracking';
import type { RArgument } from '../../r-bridge/lang-4.x/ast/model/nodes/r-argument';
import type { ParentInformation } from '../../r-bridge/lang-4.x/ast/model/processing/decorate';
import type { NodeId } from '../../r-bridge/lang-4.x/ast/model/processing/node-id';
Expand Down
Loading
Loading