public ParsingScope(ParsingScopes parsingScopes, ParsingScope parent, RangeAddress address) { _parsingScopes = parsingScopes; Parent = parent; Address = address; ScopeId = Guid.NewGuid(); }
public virtual void Add(ParsingScope parsingScope, RangeAddress rangeAddress) { if (!_rangeAddresses.ContainsKey(parsingScope.ScopeId)) { _rangeAddresses.Add(parsingScope.ScopeId, new List<RangeAddress>()); } _rangeAddresses[parsingScope.ScopeId].Add(rangeAddress); }
public virtual void AddReferenceTo(RangeAddress rangeAddress) { if (Address.CollidesWith(rangeAddress) || _referencedBy.Exists(x => x.CollidesWith(rangeAddress))) { throw new CircularReferenceException("Circular reference detected at " + rangeAddress.ToString()); } _references.Add(rangeAddress); }
private void HandleMultipleCellAddress(RangeAddress rangeAddress, ExcelAddressInfo addressInfo) { int fromCol, fromRow; _addressTranslator.ToColAndRow(addressInfo.StartCell, out fromCol, out fromRow); int toCol, toRow; _addressTranslator.ToColAndRow(addressInfo.EndCell, out toCol, out toRow, AddressTranslator.RangeCalculationBehaviour.LastPart); rangeAddress.FromCol = fromCol; rangeAddress.ToCol = toCol; rangeAddress.FromRow = fromRow; rangeAddress.ToRow = toRow; }
public virtual void CheckCircularReference(ParsingScope scope, RangeAddress rangeAddress) { var conflictingScope = (from r in _rangeAddresses where r.Key != scope.ScopeId && r.Value.Exists(x => x.CollidesWith(rangeAddress)) select r).FirstOrDefault(); if(conflictingScope.Value != null) { var conflictingRange = conflictingScope.Value.Find(x => x.CollidesWith(rangeAddress)); var errMsg = string.Format("Circular reference detected between {0} and {1}", conflictingRange, rangeAddress); throw new CircularReferenceException(errMsg); } }
public virtual ParsingScope NewScope(RangeAddress address) { ParsingScope scope; if (_scopes.Count() > 0) { scope = new ParsingScope(this, _scopes.Peek(), address); } else { scope = new ParsingScope(this, address); } _scopes.Push(scope); return scope; }
/// <summary> /// Returns true if this range collides (full or partly) with the supplied range /// </summary> /// <param name="other">The range to check</param> /// <returns></returns> public bool CollidesWith(RangeAddress other) { if (other.Worksheet != Worksheet) { return false; } if (other.FromRow > ToRow || other.FromCol > ToCol || FromRow > other.ToRow || FromCol > other.ToCol) { return false; } return true; }
public RangeAddress Create(string range) { Require.That(range).Named("range").IsNotNullOrEmpty(); var addressInfo = ExcelAddressInfo.Parse(range); var rangeAddress = new RangeAddress() { Address = range, Worksheet = addressInfo.Worksheet }; if (addressInfo.IsMultipleCells) { HandleMultipleCellAddress(rangeAddress, addressInfo); } else { HandleSingleCellAddress(rangeAddress, addressInfo); } return(rangeAddress); }
public RangeAddress Create(string range) { Require.That(range).Named("range").IsNotNullOrEmpty(); var addressInfo = ExcelAddressInfo.Parse(range); var rangeAddress = new RangeAddress() { Address = range, Worksheet = addressInfo.Worksheet }; if (addressInfo.IsMultipleCells) { HandleMultipleCellAddress(rangeAddress, addressInfo); } else { HandleSingleCellAddress(rangeAddress, addressInfo); } return rangeAddress; }
public virtual void Add(ParsingScope parsingScope, string rangeAddress) { Add(parsingScope, RangeAddress.Parse(rangeAddress)); }
private void Initialize() { var factory = new RangeAddressFactory(_parsingContext.ExcelDataProvider); _rangeAddress = factory.Create(_arguments.RangeAddress); _currentCol = _rangeAddress.FromCol; _currentRow = _rangeAddress.FromRow; SetCurrentValue(); }
protected LookupDirection GetLookupDirection(RangeAddress rangeAddress) { var nRows = rangeAddress.ToRow - rangeAddress.FromRow; var nCols = rangeAddress.ToCol - rangeAddress.FromCol; return nCols > nRows ? LookupDirection.Horizontal : LookupDirection.Vertical; }
internal virtual object Parse(string formula, RangeAddress rangeAddress) { using (var scope = _parsingContext.Scopes.NewScope(rangeAddress)) { _parsingContext.Dependencies.AddFormulaScope(scope); var tokens = _lexer.Tokenize(formula); var graph = _graphBuilder.Build(tokens); if (graph.Expressions.Count() == 0) { return null; } return _compiler.Compile(graph.Expressions).Result; } }
public ParsingScope(ParsingScopes parsingScopes, RangeAddress address) : this(parsingScopes, null, address) { }
private void HandleSingleCellAddress(RangeAddress rangeAddress, ExcelAddressInfo addressInfo) { int col, row; _addressTranslator.ToColAndRow(addressInfo.StartCell, out col, out row); rangeAddress.FromCol = col; rangeAddress.ToCol = col; rangeAddress.FromRow = row; rangeAddress.ToRow = row; }